for循环计算不正确

For loop calculation incorrect

因此对于以下计算逆波兰表示法 (RPN) 数学表达式的代码,最终计算(输出)似乎对某些输入不正确。

示例输入:

(所有输出都应该是浮点数)

def evalSimpleEqn(eqn):
    result = []
    for x in eqn:
        if x == "add":
            result.append( result.pop() + result.pop() )
        elif x == "subtract":
            result.append( result.pop() - result.pop())
        elif x == "multiply":
            result.append( result.pop() * result.pop() )
        elif x == "divide":
             y = ((result.pop()))
             z = (result.pop())
             result.append( z/y )
        else:
              result.append(x)

    return (result[-1])

具体来说,当我输入: [12, 8, "subtract", 2, "divide", 4, "divide", 1, "add"]

函数returns 0.5 而不是 1.5。我该如何解决?感谢您的任何帮助!

问题出在减法运算中:操作数在您的实现中互换了。您只需要像对待部门一样对待它。对于加法和乘法,顺序无关紧要。

def rpn_eval(s):
    result = []
    for x in s:
        print(result)
        if x == "add":
            result.append(result.pop() + result.pop())
        elif x == "subtract":
            y = result.pop()
            x = result.pop()
            result.append(x - y)
        elif x == "multiply":
            result.append(result.pop() * result.pop())
        elif x == "divide":
            y = result.pop()
            z = result.pop()
            result.append(z / y)
        else:
            result.append(x)

    return result[-1]

调用名称为 taken 的函数 eval 可能不是一个好主意。

只是为了好玩,另一种更容易扩展的方法:

#!/usr/bin/env python

"""Example code showing how to build an easily extensible RPN calculator"""

def rpn_eval(expression):
    """Calculates the passed expression list and returns the result"""
    result = []
    ops = {"add":float.__radd__,
           "subtract":float.__rsub__,
           "multiply":float.__rmul__,
           "divide":float.__rtruediv__
          }
    for arg in expression:
        result.append(arg if arg not in ops
                      else ops[arg](result.pop().__float__(), result.pop()))
    return result[-1]

def main():
    """main function"""
    tests = [
        [10, [10, 10, "add", 2, "divide"]],
        [1.5, [3, 1, "multiply", 2, "divide"]],
        [1.5, [12, 8, "subtract", 2, "divide", 4, "divide", 1, "add"]]
        ]

    for ans, expr in tests:
        calc_ans = rpn_eval(expr)
        print '{} == {}?  {}'.format(ans, calc_ans, ans == calc_ans)

if __name__ == "__main__":
    main()

主要代码有两处改动

def evalSimpleEqn(eqn):
    result = []
    for x in eqn:
        if x == "add":
            result.append( result.pop() + result.pop() )
        elif x == "subtract":
            # (1) reorder operands, as pop() extract firstly subtrahend and then minuend 
            result.append( - result.pop() + result.pop())
        elif x == "multiply":
            result.append( result.pop() * result.pop() )
        elif x == "divide":
             y = ((result.pop()))
             z = (result.pop())
             # (2) add 1.* to convert result to float  
             result.append( 1.* z/y )
        else:
              result.append(x)
    return (result[-1])