阶乘递归的调用栈:Factorial(4)
1. 第一次调用入栈
执行 Factorial(4) 时,系统为本次调用建立栈帧,保存参数 n=4、返回地址和现场信息。
Factorial(4)n=4
当前递归深度为 1。
int Factorial(int n) {
if (n == 0) return 1;
return n * Factorial(n - 1);
}
2. 递归体继续调用
n != 0,当前调用还不能返回;它要等待 Factorial(3) 的结果,所以新调用继续压栈。
Factorial(4)wait 4 *
Factorial(3)n=3
外层调用被挂起,控制权交给内层调用。
return 4 * Factorial(3);
3. 一直压到递归出口
每进入一层递归,就压入一个新的栈帧。到 n=0 时命中递归出口。
Factorial(4)wait
Factorial(3)wait
Factorial(2)wait
Factorial(1)wait
Factorial(0)return 1
栈顶是最后进入的调用。
if (n == 0) {
return 1;
}
4. 出口返回,栈顶弹出
Factorial(0) 返回 1 后,它的栈帧被弹出,上一层 Factorial(1) 才能继续计算。
Factorial(4)wait
Factorial(3)wait
Factorial(2)wait
Factorial(1)1 * 1
返回顺序与调用顺序相反。
Factorial(1)
= 1 * Factorial(0)
= 1 * 1
5. 逐层恢复现场
每一层拿到内层返回值后,完成自己的乘法,再返回给更外层。
Factorial(4)wait
Factorial(3)wait
Factorial(2)2 * 1
Factorial(2) 返回后,Factorial(3) 才能继续。
Factorial(2) = 2 * 1 = 2
Factorial(3) = 3 * 2 = 6
Factorial(4) = 4 * 6 = 24
6. 最外层返回,调用栈清空
Factorial(4) 返回 24 后,最初的栈帧也被弹出,本次递归过程结束。
递归深度决定同时存在的栈帧数量。
// If each frame uses O(1) space:
space = O(recursion depth)