递归函数的理解

80 阅读1分钟

前言

递归,就是在运行的过程中调用自己。 一个函数调用自己,就叫做递归函数。

博主现在在学go语言,就用go的代码演示了,但是不影响思路的互通性

下面这行代码,如果用debug看的话i这个变量从i=7,会慢慢减到i=1, 然后!,又会从i=1往上慢慢加到7,我当时就很纳闷了,这是咋运行的嘞?它把数据存哪了嘞?

解释

原来它存在了栈帧中,栈帧和栈一样,讲究先进后出,所以最先加上的是factorial(1),它是第一个被弹出的

这个图片是递归的展开

image.png

以下是具体过程的解释:

  1. 当 factorial(7) 被调用时,i 的值是7。因为 i 大于1,函数会递归调用 factorial(6)
  2. 现在,factorial(6) 被推入调用栈,i 的值是6。这个过程会继续,直到 i 的值减到1。
  3. 当 i 的值为1时,达到基本情况,函数返回1,不再递归调用。
  4. 现在,调用栈开始弹出栈帧,每个栈帧的返回值会被用来计算上一个栈帧的结果。这就是 i 的值从1加回到7的过程。

以下是对上面具体过程的简略思路:

factorial(7)  // 第一个栈帧
  -> factorial(6)  // 第二个栈帧
    -> factorial(5)  // 第三个栈帧
      -> ...
        -> factorial(1)  // 最后一个栈帧,返回1

阶乘代码



import "fmt"

func factorial(i int) int {
    if i <= 1 {
        return 1
    }
    return i * factorial(i-1)
}

func main() {
    var i int = 7
    fmt.Printf("Factorial of %d is %d\n", i, factorial(i))
}

答案:
Factorial of 7 is 5040