python - 计算器到python中的递归基本操作
问题描述
我正在努力解决这个递归问题。我想用递归为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)
请问你能帮忙吗?
解决方案
您的评估逻辑已关闭-鉴于这些简单的表达式,我们实际上只关心两种情况,元组或非元组。如果它是一个元组,我们将嵌入的二元运算符应用于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
>
我相信,如果你试图用这个简单的代码做任何更复杂的事情,你很快就会遇到问题。
推荐阅读
- javascript - 带有打字效果的Javascript文本冒险
- python - 如何在 Tkinter 的文本字段中制作可清除的文本?
- python - 运行 Python 脚本的关键错误(使用 Atom)
- cookies - 如何在 GitHub Actions 中使用 cookie/身份验证运行测试?
- ubuntu - 无法建立与 http://controller:9696/v2.0/networks 的连接
- javascript - 我的查询选择器没有捕获所有 DOM 元素
- google-apps-script - 如何在 getSheetByName 中使用变量作为参数?
- django - DRF 中的动作装饰器不适用于 url_path
- python - 如何在 Python 中为协变可变集合类类使用类型提示?
- optaplanner - 使用时间链模式,为什么下一个任务的值总是为空?