我正在努力解决此递归问题。我想通过递归为python中的基本操作创建一个计算器。
ops = {"+": (lambda x,y: x+y), "-": (lambda x,y: x-y), "*": (lambda x,y: x*y)}
def calculator(expr):
for i in expr:
if type(i) != tuple:
return (ops[expr[1]] (expr[0],expr[2]))
else:
return calculator((i))
对于calculator(((1, '+', 2), '*', 3))
,我期望9
,但我得到(1, '+', 2, 1, '+', 2, 1, '+', 2)
请您帮忙?
答案 0 :(得分:0)
我不确定您是否会在此递归……
一些直接的问题:
i
永远不会是tuple
,但有时可能是其中一个的实例:您可以使用isinstance(i, tuple)
您永远不会评估操作的参数
这将导致您的代码执行以下操作:
calculator(((1, '+', 2), '*', 3))
ops['*']((1, '+', 2), 3)
(1, '+', 2) * 3
请注意,将list
或tuple
与n
“相乘”将导致其元素重复n
次-这就是您所看到的
答案 1 :(得分:0)
您基本上是在写遍历二叉树,特别是binary expression tree。使用元组是表示树的一种方法(尽管有更好的方法,例如实际上是implementing a binary tree)。
现在,关于您的代码。您的表达可以两种不同的形式出现:数字或元组。第一个只是一个简单的无聊数字。元组将用来表示更复杂的表达式。因为它是一棵二叉树,所以元组将始终具有三个元素。
以下代码应该可以使用。
#ops is defined as you defined it
def calculate(expr):
if isinstance(expr, int): # this is the terminating condition for your recursion
return expr
if isinstance(expr, tuple):
return ops[expr[1]](calculate(expr[0]), calculate(expr[2]))
代码将输出最终的整数结果。当然,您也可以使用其他数字类型(例如float
)。对于在python中开始递归来说,这很好。
P.S .:代码未经测试,请告知代码是否无效。
答案 2 :(得分:0)
您的评估逻辑不正确-给出这些简单的表达式,我们实际上只关心两种情况,元组或不元组。如果是元组,则将嵌入式二进制运算符应用于两个参数上的calculator()
的递归调用。如果不是元组,则按原样返回:
OPERATIONS = { \
"+": (lambda x, y: x + y), \
"-": (lambda x, y: x - y), \
"*": (lambda x, y: x * y), \
}
def calculator(expr):
if isinstance(expr, tuple):
return OPERATIONS[expr[1]](calculator(expr[0]), calculator(expr[2]))
return expr
print(calculator(((1, '+', 2), '*', 3)))
输出
> python3 test.py
9
>
我相信,如果您尝试使用此简单的代码执行更复杂的操作,则会很快遇到问题。