我在apple swift文档中找到了这段代码
indirect enum ArithmeticExpression {
case Number(Int)
case Addition(ArithmeticExpression, ArithmeticExpression)
case Multiplication(ArithmeticExpression, ArithmeticExpression)
}
func evaluate(expression: ArithmeticExpression) -> Int {
switch expression {
case .Number(let value):
return value
case .Addition(let left, let right):
return evaluate(left) + evaluate(right)
case .Multiplication(let left, let right):
return evaluate(left) * evaluate(right)
}
}
// evaluate (5 + 4) * 2
let five = ArithmeticExpression.Number(5)
let four = ArithmeticExpression.Number(4)
let sum = ArithmeticExpression.Addition(five, four)
let product = ArithmeticExpression.Multiplication(sum, ArithmeticExpression.Number(2))
print(evaluate(product))
// prints "18"
我不会理解这里的递归是如何发生的,以及为什么在返回行的return语句中将常量声明声明为参数?
答案 0 :(得分:1)
把它想象成一棵树。节点=表达式。常数=叶。
(图片来源ruslanspivak.com)
在遍历它时 - 你会检查两个操作数中的每一个。如果它是表达式,则需要对其进行计算,因此使用此操作数调用“evaluate”。如果它是一个常数,那就把它想象成一个结果 - 它只是一个数字,所以不再需要计算。 最后,我们总是得到一个常量(=叶子)然后当堆栈开始折叠时,值结果在树中返回“up”以累加到总结果。
为了更多地潜入主题,我建议谷歌搜索“二元表达树”。
(顺便说一下,代码示例并不倾向于优先级。在加法之前计算乘法只是因为调用的顺序。 如果我们真的想照顾优先事项:例如“(”,“)”over“*”,“/”,这里需要一个操作堆栈。)