2012-10-27 2 views
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) 
+0

((3 + 2)/(1 + 4)) -> (5/(1 + 4)) -> (5/5) -> 1 ... 이것은 재귀가 무너질 것이라고 생각하는 것입니다. –

+0

도움이 될 수있어서 기쁩니다. BTW, 원래 접두사 기반 소스를 포함하도록 질문을 롤백했습니다. 내 대답의 형식이 질문에서 더 의미가 있습니다. – mackworth

답변

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) 
+0

예. 정확히 내가 찾고있는 것입니다. 감사합니다. –

0

유효한 데이터의 입력을 구문 분석하고 표현과 같이 구문 분석 compiler 모듈을 사용

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

다음 사용할 수 있습니다

eval(expr) 
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 
관련 문제