递归函数
当一个函数在其函数体内调用自身,则称之为递归。递归是一种强有力的技术特别是在处理数据结构的过程中.
package main
import "fmt"
func main() {
result := 0
for i := 0; i <= 10; i++ {
result = processing(i)
fmt.Printf("processing(%d) is: %d\n", i, result)
}
}
func processing(n int) (res int) {
if n <= 1 {
res = 1
} else {
res = processing(n-1) + processing(n-2)
}
return
}
输出结果:
processing(0) is: 1
processing(1) is: 1
processing(2) is: 2
processing(3) is: 3
processing(4) is: 5
processing(5) is: 8
processing(6) is: 13
processing(7) is: 21
processing(8) is: 34
processing(9) is: 55
processing(10) is: 89
在使用递归函数时经常会遇到的一个重要问题就是栈溢出:一般出现在大量的递归调用导致的程序栈内存分配耗尽。这个问题可以通过一个名为懒惰求值的技术解决,在 Go 语言中,我们可以使用管道(channel)和 goroutine也会通过这个方案来优化斐波那契数列的生成问题。
这样许多问题都可以使用优雅的递归来解决,比如说著名的快速排序算法。