尾递归
如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。
错误实例
func sum(_ n: Int) -> Int {
if n == 0 {
return 0
}
return n + sum(n - 1)
}
sum(10) // 55
sum(100) // 5050
*尾递归函数的特点是在回归过程中不用做任何操作。显然这不符合
正确实例
func sum(_ n: Int) -> Int {
func sumInternal(_ n: Int, current: Int) -> Int {
if n == 0 {
return current
} else {
return sumInternal(n - 1, current: current + Int(n))
}
}
return sumInternal(n, current: 0)
}
sum(10000) //50005000