递归函数

当一个函数在其函数体内调用自身,则称之为递归。递归是一种强有力的技术特别是在处理数据结构的过程中.

  1. package main
  2. import "fmt"
  3. func main() {
  4. result := 0
  5. for i := 0; i <= 10; i++ {
  6. result = processing(i)
  7. fmt.Printf("processing(%d) is: %d\n", i, result)
  8. }
  9. }
  10. func processing(n int) (res int) {
  11. if n <= 1 {
  12. res = 1
  13. } else {
  14. res = processing(n-1) + processing(n-2)
  15. }
  16. return
  17. }

输出结果:

  1. processing(0) is: 1
  2. processing(1) is: 1
  3. processing(2) is: 2
  4. processing(3) is: 3
  5. processing(4) is: 5
  6. processing(5) is: 8
  7. processing(6) is: 13
  8. processing(7) is: 21
  9. processing(8) is: 34
  10. processing(9) is: 55
  11. processing(10) is: 89

在使用递归函数时经常会遇到的一个重要问题就是栈溢出:一般出现在大量的递归调用导致的程序栈内存分配耗尽。这个问题可以通过一个名为懒惰求值的技术解决,在 Go 语言中,我们可以使用管道(channel)和 goroutine也会通过这个方案来优化斐波那契数列的生成问题。

这样许多问题都可以使用优雅的递归来解决,比如说著名的快速排序算法。