["add",["subtract",["multiply",2,["add",1,3]], 4 ] , 5 ]
我该怎么做这些操作
当编程看到“添加”时,它会添加1和3并返回4个新列表
["add",["subtract",["multiply",2, 4 ], 4 ] , 5 ]
当编程看到“乘法”它确实2 * 4并且返回8个新列表变为
["add",["subtract",8, 4 ] , 5 ]
一次递归后
["add",4 , 5 ]
在最后一次递归之后
return 9
答案 0 :(得分:1)
您应该编写一个遍历列表并执行操作的递归函数。
这实际上是相当微不足道的,但我不想只给你答案,特别是因为它听起来像是家庭作业。 :)所以用你想做的事情更新你的问题,我们会告诉你哪里出错了。
答案 1 :(得分:1)
import operator
def do_math(op):
try:
return getattr(operator, op[0][:3])(*[do_math(arg) for arg in op[1:]])
except TypeError:
return op
L = ["add",["subtract",["multiply",2,["add",1,3]], 4 ] , 5 ]
print do_math(L)
答案 2 :(得分:0)
要做的第一件事就是将它作为树直观地绘制出来:
如果你看左边的孩子(减去,乘以/ 4等)你会看到它也是一棵树;左半部分(乘法,2 /加等)。
实际上,您可以将每个节点的后代视为树,包括(a)运算符,左子树和右子树,或(b)值(叶节点) ,没有更多的后代)。
to evaluate a tree:
if it is a value:
you have the final value; return it
otherwise, it is an operator:
evaluate the left sub-tree
evaluate the right sub-tree
do operation(left-tree-value, right-tree-value)
return the result
您会注意到'evaluate tree'调用自身来操作子树 - 这是递归,解决问题取决于解决同一问题的较小版本然后组合结果。
所以最终的评估顺序如下:
what is tree value?
add: {tree1} + {tree2}
what is tree1?
subtract: {tree3} - {tree4}
what is tree3?
multiply: {tree5} * {tree6}
what is tree5?
2
what is tree6?
add: {tree7} + {tree8}
what is tree7?
1
what is tree8?
3
add: 1 + 3
4
multiply: 2 * 4
8
what is tree4?
4
subtract: 8 - 4
4
what is tree2?
5
add: 4 + 5
9