数据结构——栈在递归中的应用
递归是一种简洁的编程思想,指函数直接或间接调用自身来解决问题。计算机在执行递归函数时,依赖栈来存储“每次递归调用的上下文”(包括局部变量、参数、返回地址等),递归的“递推深入”和“回归回溯”过程,完全契合栈“后进先出”的特性。下面通过阶乘计算和斐波那契数列两个例子,具体说明栈在递归中的作用。
1. 递归的执行与系统栈的关系
递归函数的执行分为“递推”和“回归”两个阶段:
- 递推:从原问题出发,不断分解为更小的子问题,直到触发“终止条件”(无法再分解的最小问题);
- 回归:从终止条件开始,逐步返回子问题的结果,最终得到原问题的解。
系统栈在这两个阶段中,负责保存和恢复每一层递归的“上下文”(即函数调用时的局部状态)。以“阶乘函数fact(n) = n * fact(n-1)
(终止条件fact(0)=1
)”为例,计算fact(3)
时,系统栈的变化如下:
-
递推阶段:
调用fact(3)
→ 系统栈压入n=3
的上下文(包含n
的值、返回地址等);
因n>0
,调用fact(2)
→ 栈压入n=2
的上下文;
调用fact(1)
→ 栈压入n=1
的上下文;
调用fact(0)
→ 栈压入n=0
的上下文。 -
回归阶段:
fact(0)
触发终止条件,返回1
→ 栈弹出<