关键词
- 递归
- 栈
- 基线条件
- 递归条件
循环与递归
Leigh Caldwell在Stack Overflow上说的一句话:如果使用循环,程序的性能可能更高;如果使用递归,程序可能 更容易理解。如何选择要看什么对你来说更重要。
为什么循环会比递归性能更高?这个就涉及到计算机底层设计逻辑,因为函数每次调用都需要创建栈,压栈,出栈,而循环就省略了这个过程,所以性能更高。
每一个递归函数都包括两个条件:递归条件 与 基线条件。递归条件是函数调用自己,而基线条件是函数不再调用自己,这样就能避免死循环。
练习
func factorial(x int) (res int) {
// 基线条件 x == 1
if x == 1 {
return 1;
}
// 递归条件 x > 1
return x * factorial(x - 1)
}
func main() {
results := factorial(5)
fmt.Println("results", results)
}
// 输出
$ go run main.go
results 120
小结
- 递归函数就是调用函数自己,每一个递归函数都有递归条件与基线条件。
- 每个函数都有一个调用栈,如果调用栈很长,可能会比较占用内存。