ios - swift : Recursively calling a function with an enum type as a parameter

标签 ios swift enums

我在苹果 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>re

(图片来源 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/

相关文章:

ios - UITableViewCell 内的连续动画

ios - 如何在 Swift4 中获取另一个类的枚举内容?

swift - 更改 json 对象的值

ios - 后台区域监控信标区域不工作

ios - 如何为每个 TableViewCell 添加具有不同重复次数的 Multiple TableViewCell

wpf - 无法在 WPF 中找到静态引用的枚举类型

enums - 当枚举变体已知时解包内部类型

c++ - 如何在 C++ 中使用枚举作为标志?

ios - 内存警告无法正常工作

swift - 具有多个目标的 Xcode Swift 4.2 迁移