4

完全に括弧で囲まれた方程式を解くことができる再帰的な方法を考え出すのに苦労しています..など((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)
4

3 に答える 3

2

試してみてくださいshunting-yard algorithm

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
于 2012-10-27T21:48:52.480 に答える
2

あなたの文法は:

expr ::= int | ( expr op expr )

正しい?

それで、エラーチェックを無視すると、次のようになります...

def evalExpr(it):
    item = it.next()
    if isInt(item):
        return int(item)
    else: 
        //item should = lparen
        operand1 = evalExpr(it)
        op = it.next()        
        operand2 = evalExpr(it)
        rparen = it.next() 
        return execute(op, operand1, operand2)
于 2012-10-27T20:54:30.147 に答える
0

有効なデータの入力を解析し、compilerモジュールを使用して次のように式を解析します。

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

そして、次を使用できます:

eval(expr)
于 2012-10-27T20:43:00.170 に答える