我尝试在 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/