swift - Swift 4 中的尾递归(尾调用优化)

标签 swift functional-programming

我尝试在 Swift 中执行以下简单功能:

 func sum (n: Int, currentSum: Int = 0) -> Int {
    return n == 0 ? currentSum :
                    sum(n: n-1,
                        currentSum: currentSum + n)
 }

我预计编译器会使用尾递归优化。但是我陷入了(字面上的 :-P)堆栈溢出问题。

我是否需要设置任何标志以使编译器进行此类优化,我的代码有任何错误或此编译器优化不可用?

谢谢!

最佳答案

正如 Martin 指出的那样,除非您打开优化器 (-O),否则在任何情况下您都不会获得 TCO,但即使在那种情况下,也无法保证您会获得TCO,所以你真的不能依赖它。 Swift 对递归算法不是特别友好。通常你会这样写:

func sum(n: Int) -> Int {
    return (1...n).reduce(0, +)    
}

或者保持相同的计算模式(即从 n 倒数到 1):

func sum(n: Int) -> Int {
    return (1...n).reversed().reduce(0, +)
}

关于swift - Swift 4 中的尾递归(尾调用优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55011640/

相关文章:

swift - 在 Swift 中从 nib 加载 UIView

iOS - AWS SNS 端点设置为禁用

data-structures - 更新树中的值

graph - OCaml 中以**纯**函数方式实现图的 DFS 和 BFS

haskell - 为什么 IO 是单子(monad)而不是共单子(monad)?

swift - 当我调用内部带有 NSTimer 的函数时出现 NSException 错误

ios - 如何为圆形单元格的顶部边框着色?

ios - 无需等待提交即可更新iOS App

haskell - 什么是 zygo/meta/histo/para/futu/dyna/whatever-morphisms?

functional-programming - F#重写计算表达式