Swift:以枚举类型作为参数递归调用函数

时间:2016-02-05 07:19:24

标签: ios swift enums

我在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语句中将常量声明声明为参数?

1 个答案:

答案 0 :(得分:1)

把它想象成一棵树。节点=表达式。常数=叶。

<ruslanspivak.com>re

(图片来源ruslanspivak.com)

在遍历它时 - 你会检查两个操作数中的每一个。如果它是表达式,则需要对其进行计算,因此使用此操作数调用“evaluate”。如果它是一个常数,那就把它想象成一个结果 - 它只是一个数字,所以不再需要计算。 最后,我们总是得到一个常量(=叶子)然后当堆栈开始折叠时,值结果在树中返回“up”以累加到总结果。

为了更多地潜入主题,我建议谷歌搜索“二元表达树”。

(顺便说一下,代码示例并不倾向于优先级。在加法之前计算乘法只是因为调用的顺序。 如果我们真的想照顾优先事项:例如“(”,“)”over“*”,“/”,这里需要一个操作堆栈。)