用递归法求解全括号表达式

2024-10-01 19:24:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难想出一个递归的方法来解决完全带圆括号的方程,比如((3+2)/(1+4))。我能够想出一个递归的解决方案来解决像+*+3421这样的中缀表达式,但是对于((3+2)/(1+4))这样的东西,我有点卡住了。在

def evalPrefix(exp):
    it = iter(exp)
    return evalPrefixInner(it)

def evalPrefixInner(it):
    item = it.next()
    if isInt(item):
        return int(item)
    else: 
        operand1 = evalPrefixInner(it)
        operand2 = evalPrefixInner(it)
        return execute(item, operand1, operand2)

Tags: 方法return表达式defit解决方案item方程
3条回答

分析输入中的有效数据,然后使用^{}模块来解析表达式,如下所示:

import compiler
expr = compiler.compile(r'((3+2)/(4+1))', 'err', 'eval')

然后您可以使用:

^{pr2}$

你的语法是:

expr ::= int | ( expr op expr )

对吗?在

所以,忽略错误检查,比如。。。在

^{pr2}$

试试^{}

dic={"+": lambda x, y:x+y,
     "-": lambda x, y:x-y,
     "/": lambda x, y:x/y,
     "%": lambda x, y:x%y,
     "*": lambda x, y:x*y}

def algo(x, op=None, nums=None):
    if x != "":
        op = op if op else []
        nums = nums if nums else []
        item = x[0]
        if item in ("+","-","%","/","*"):
            op.append(item)
        if item.isdigit():
            nums.append(item)
        if item==")":
            operator = op.pop()
            opd1, opd2 = int(nums.pop()), int(nums.pop())
            ans = dic[operator](opd1, opd2)
            nums.append(ans)
        return algo(x[1:], op, nums)
    else:
        if op and nums:
            operator = op.pop()
            opd1, opd2 = int(nums.pop()), int(nums.pop())
            return dic[operator](opd1, opd2)
        else:
            return nums[-1]

print algo("((3+2)/(1+4))")  #output :1
print algo("((5+2)*3*(2+5))") #output :147

相关问题 更多 >

    热门问题