for循环计算不正确
For loop calculation incorrect
因此对于以下计算逆波兰表示法 (RPN) 数学表达式的代码,最终计算(输出)似乎对某些输入不正确。
示例输入:
- [10, 10, "add", 2 "divide"] 等同于 (10+10)/2 并且应该产生 10
的输出
- [3, 1, "multiply", 2 "divide"] 等同于 (3*1)/2 并且应该产生 1.5
的输出
(所有输出都应该是浮点数)
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])
因此对于以下计算逆波兰表示法 (RPN) 数学表达式的代码,最终计算(输出)似乎对某些输入不正确。
示例输入:
- [10, 10, "add", 2 "divide"] 等同于 (10+10)/2 并且应该产生 10 的输出
- [3, 1, "multiply", 2 "divide"] 等同于 (3*1)/2 并且应该产生 1.5 的输出
(所有输出都应该是浮点数)
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])