Recur16. Вывести значение целочисленного выражения, заданного в виде строки $$S$$. Выражение определяется следующим образом:
<выражение>::= <терм>| <выражение>+<терм>| <выражение>- <терм>
<терм>::= <элемент>| <терм>* <элемент>
<элемент>::= <цифра>| (<выражение>)
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
program Recur16; function LenExpression(S:String):integer; var len:integer; begin if length(S)<=0 then Result:=0 else case s[length(S)] of ')': begin delete(S,length(S),1); len:=LenExpression(S); delete(S,length(S)-len+1,len); Result:=len+LenExpression(S)+1; end; '(': Result:=1 else begin delete(S,length(S),1); Result:=1+LenExpression(S); end; end; end; function Expression(S:String):integer; var Res,len:integer; begin Res:=0; if length(S)>0 then begin case s[length(S)] of ')': begin delete(S,length(S),1); len:=LenExpression(S); Res:=Expression(S); delete(S,length(S)-len+1,len); end; '0'..'9': begin Res:=(ord(S[length(S)])-48); delete(S,length(S),1); end; end; if length(S)>0 then Case s[length(S)] of '-': begin delete(S,length(S),1); Result:=Expression(S)-Res; end; '+': begin delete(S,length(S),1); Result:=Expression(S)+Res; end; '*': begin delete(S,length(S),1); Result:=Expression(S)*Res; end; '(': Result:=Res; end else Result:=Res; end else Writeln('!!error!!'); end; var S:String; begin Write('S: '); Readln(S); S:='('+S+')'; Writeln('Exp: ',Expression(S)); end. |
Другие задачи из раздела Recur можно посмотреть здесь.
Алгоритм. В Foo ищем в выражении справа налево индекс l первого оператора «+» или «-» , который находится вне скобок. Если нашли — результат равен Foo(s, k, l-1) (+/-) Term(s, l+1, n). Иначе результат равен Term(s, k, n). В Term аналогично, но для оператора «*». В Elem результат или цифра, или выражение в скобках. Чтобы его посчитать нужно кинуть строку без крайних скобок в Foo.