我在苹果 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 语句中将常量声明声明为参数?
最佳答案
把它想象成一棵树。节点=表达式。常量=叶子。
(图片来源 ruslanspivak.com)
在遍历它时 - 您检查两个操作数中的每一个。如果它是一个表达式,你需要计算它,所以你用这个操作数调用'evaluate'。如果它是一个常数,就把它想象成一个结果——它只是一个数字,所以不需要更多的计算。 最后,我们总是得到一个常量 (=leaves),然后堆栈开始折叠并且值结果在树中“向上”返回以加总结果。
为了更深入地研究这个主题,我建议使用谷歌搜索“二元表达式树”。
(顺便说一句,代码示例不倾向于优先级。乘法先于加法计算只是因为调用顺序。 如果我们真的想处理优先事项:例如"(", ")"over "*", "/",这里需要一个操作栈。)
关于ios - swift : Recursively calling a function with an enum type as a parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35218376/