一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数,例如连加、连乘及阶乘等。

递归特性:

  1. 1. 调用自身函数
  2. 2. 必须有一个明确的结束条件
  3. 3. 在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返 回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

案例一:

  1. package main
  2. import "fmt"
  3. func factorial(n int)int{
  4. if n == 0{
  5. return 1
  6. }
  7. return n * factorial(n-1)
  8. }
  9. func main() {
  10. // 计算n的阶乘,即 n!
  11. var ret = factorial(4)
  12. fmt.Println(ret)
  13. }

image.png

案例二:

这个数列生成规则很简单,每一项都是前两项的和,举例 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……

  1. package main
  2. import "fmt"
  3. func fib(n int) int {
  4. if n == 2 || n == 1 {
  5. return 1
  6. }
  7. return fib(n-1) + fib(n-2)
  8. }
  9. func main() {
  10. // 计算n的阶乘,即 n!
  11. ret:=fib(6)
  12. fmt.Println(ret)
  13. }

image.png