我需要一个使用递归计算后缀表达式的算法。在此后缀表达式中,操作数可以是多个数字。空格用于区分两个操作数。因此表达式“45 68+”是有效的。我想从相反的方向评估它,但我认为这不应该是正确的。有人能帮我一下算法吗。提前谢谢。
7ivaypg91#
我觉得这不是一个递归友好问题。但我相信可以这样做。我想到了两种方法:
选项#1:进行函数递归调用并返回与Wiki上描述的堆栈推送和弹出操作相匹配
这种方法的缺点是,您会很快发现从函数返回的数据可能相当复杂。可能是一个操作员。可能使用可选操作数(IE:number)。您将返回可能应该对其进行操作(方法)的结构/对象。
选项#2:每个递归调用处理输入流的下一个字符
我认为这种方法将作为参数传入堆栈,并可能是当前数字的“累加器”——在将数字放入堆栈之前将其累加为数字。将返回一个大规模尾部递归数值结果。这种方法实际上只是将循环重写为递归。
gopyfrb32#
下面是一种伪代码,它将用于带有+/-的后缀表达式。我认为您可以进一步扩展这个想法。如果你仍然面临困难,请将我发送至2shanks.p@gmail.com因为我不是这个网站的常客。
void recursivePostfix(char* expr) { if(!expr) return; bool flag=true; static double result=0; double v1=result, v2=0, dec=0; char oper='0'; int i=0, state=1; do { if('0' != oper) { switch(oper) { case '+': result=v1+v2; break; case '-': result=v1-v2; break; case '*': result=v1*v2; break; case '/': result=v1/v2; break; } oper = '0'; v1 = result; v2 = 0; recursivePostfix(expr+i); } if(SPACE_CHAR == *(expr+i) && state++) continue; switch(state) { case 1: v1 = v1*10 + (expr[i]-'0'); break; case 2: v2 = v2*10 + (expr[i]-'0'); break; case 3: oper = *(expr+i); } }while(0 != *(expr+i++)); cout << result; }
4bbkushb3#
我只是为面试编写代码,所以这里是我使用Python的解决方案:
def recursive_postfix(s): s = s.split(' ') if len(s) == 1: return s[0] res = None for i in range(len(s)): if s[i] in ['+', '-', '*', '/']: res = eval(f'{s[i-2]}{s[i]}{s[i-1]}') break s = s[0:i-2] + [str(res)] + s[i+1:] return recursive_postfix(' '.join(s)) assert recursive_postfix('2 2 + 1 *') == '4' # (2 + 2) * 1 assert recursive_postfix('3 4 2 + * 5 *') == '90' # 3 * (4 + 2) * 5 assert recursive_postfix('7 2 2 * -') == '3' # 7 - (2 * 2)
3条答案
按热度按时间7ivaypg91#
我觉得这不是一个递归友好问题。但我相信可以这样做。
我想到了两种方法:
选项#1:进行函数递归调用并返回与Wiki上描述的堆栈推送和弹出操作相匹配
这种方法的缺点是,您会很快发现从函数返回的数据可能相当复杂。可能是一个操作员。可能使用可选操作数(IE:number)。您将返回可能应该对其进行操作(方法)的结构/对象。
选项#2:每个递归调用处理输入流的下一个字符
我认为这种方法将作为参数传入堆栈,并可能是当前数字的“累加器”——在将数字放入堆栈之前将其累加为数字。将返回一个大规模尾部递归数值结果。
这种方法实际上只是将循环重写为递归。
gopyfrb32#
下面是一种伪代码,它将用于带有+/-的后缀表达式。我认为您可以进一步扩展这个想法。如果你仍然面临困难,请将我发送至2shanks.p@gmail.com因为我不是这个网站的常客。
4bbkushb3#
我只是为面试编写代码,所以这里是我使用Python的解决方案: