程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,跳出递归

递归的格式

  1. func recursion() {
  2. if(){ return } // 跳出递归条件
  3. recursion() // 函数调用自身
  4. }
  5. func main() {
  6. recursion()
  7. }

Go 语言支持递归,但我们在使用递归时,开发者需要设置退出条件,否则递归将陷入无限循环中
递归函数对于解决数学上的问题是非常有用的,就像计算阶乘,生成斐波那契数列等

阶乘

  1. package main
  2. import "fmt"
  3. func Factorial(n uint64)(result uint64) {
  4. if (n > 0) {
  5. result = n * Factorial(n-1)
  6. return result
  7. }
  8. return 1
  9. }
  10. func main() {
  11. var i int = 15
  12. fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(uint64(i)))
  13. }
  14. /*
  15. 以上实例执行输出结果为:
  16. 15 的阶乘是 1307674368000
  17. */

斐波那契数列

以下实例通过 Go 语言的递归函数实现斐波那契数列:

  1. package main
  2. import "fmt"
  3. func fibonacci(n int) int {
  4. if n >= 2 { return fibonacci(n-1) + fibonacci(n-2) }
  5. return n
  6. }
  7. func main() {
  8. var i int
  9. for i = 0; i <= 12; i++ {
  10. fmt.Printf("%d\t", fibonacci(i))
  11. }
  12. }
  13. /*
  14. 以上实例执行输出结果为:
  15. 0 1 1 2 3 5 8 13 21 34 55 89 144
  16. */