前言
递归,就是在运行的过程中调用自己。 一个函数调用自己,就叫做递归函数。
博主现在在学go语言,就用go的代码演示了,但是不影响思路的互通性
下面这行代码,如果用debug看的话i这个变量从i=7,会慢慢减到i=1, 然后!,又会从i=1往上慢慢加到7,我当时就很纳闷了,这是咋运行的嘞?它把数据存哪了嘞?
解释
原来它存在了栈帧中,栈帧和栈一样,讲究先进后出,所以最先加上的是factorial(1),它是第一个被弹出的
这个图片是递归的展开
以下是具体过程的解释:
- 当
factorial(7)被调用时,i的值是7。因为i大于1,函数会递归调用factorial(6)。 - 现在,
factorial(6)被推入调用栈,i的值是6。这个过程会继续,直到i的值减到1。 - 当
i的值为1时,达到基本情况,函数返回1,不再递归调用。 - 现在,调用栈开始弹出栈帧,每个栈帧的返回值会被用来计算上一个栈帧的结果。这就是
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