尾递归
函数调用自身,称为递归。如果尾调用自身,就称为尾递归。
递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。
对比
package main
import (
"fmt"
)
// 存在尾递归
func fibonacci(n int) int {
if n <= 1 {
return 1
}else {
return fibonacci(n - 1) + fibonacci(n - 2)
}
}
// 消除尾递归
func fibonacci2(n int, args [2]int) int {
if n <= 1 {
return args[1]
}else {
args[0], args[1] = args[1], args[0] + args[1]
return fibonacci2(n-1, args)
}
}
func main() {
// 计算时间过长
//fmt.Println(fibonacci(1000))
// 很快算出来
args := [2]int{1, 1,}
fmt.Println(fibonacci2(1000, args))
}