繁体   English   中英

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

[英]Swift : Recursively calling a function with an enum type as a parameter

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

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

<ruslanspivak.com>重新

(图片来源ruslanspivak.com)

遍历它时-检查两个操作数中的每一个。 如果它是一个表达式,则需要对其进行计算,因此您可以使用此操作数调用“求值”。 如果它是一个常数,则将其视为一个结果-它只是一个数字,因此不需要更多的计算。 最后,我们总是获得一个常量(=叶),然后当堆栈开始折叠且值结果在树中返回“ up”时,便得出总结果。

为了进一步研究该主题,我建议使用Google搜索“二进制表达式树”。

(顺便说一下,该代码示例不倾向于优先级。乘法运算仅在加法之前进行,仅是因为调用的顺序。如果我们真的想照顾优先级,例如,“ *”上的“(”,“)” ,“ /”,此处需要用于操作的堆栈。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM