You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归斐波那契数列栈操作问询:递归函数执行时栈的变化与分支解析

递归斐波那契的栈操作全拆解

兄弟,我太懂你这种盯着递归栈分支一头雾水的感觉了——当年我第一次啃递归的时候,对着栈帧图愣了一下午才捋明白。咱们拿最经典的递归斐波那契代码开刀,一步步拆到最细,保证你能看清每一步栈里到底在发生啥。

先看基础递归代码

首先,咱们用最常见的Python实现来当例子:

def fib(n):
    if n <= 1:  # 基准情况,触底返回
        return n
    else:
        return fib(n-1) + fib(n-2)  # 递归分支:先算左边,再算右边

先搞懂:什么是调用栈和栈帧?

每次调用函数时,操作系统会在**调用栈(Call Stack)**里给这个调用分配一个「栈帧」——你可以把它看成一个临时的“工作区”,里面存着三个关键信息:

  • 函数的参数值(比如这次调用的n是4还是3)
  • 局部变量(如果有的话,这里fib没额外变量,但会存后续要计算的中间值)
  • 返回地址:这个函数执行完后,要回到代码里的哪个位置继续跑(比如fib(4)调用fib(3)后,得回到+ fib(2)那一步接着算)

调用栈是**后进先出(LIFO)**的:最后压进去的栈帧,会最先被弹出来处理结果。

拿fib(4)当例子,一步步拆栈操作

咱们就看计算fib(4)的全过程,每一步都盯着栈的变化:

步骤1:初始调用fib(4)

  • 栈里压入第一个栈帧:fib(4),此时栈是 [fib(4)],栈顶是它。
  • 检查n<=1?4>1,所以要执行fib(3) + fib(2)——递归的分支点来了!程序会先处理左边的fib(3),右边的fib(2)得等左边返回结果再处理。

步骤2:调用fib(3)

  • 栈里压入fib(3),现在栈变成 [fib(4), fib(3)],栈顶是fib(3)。
  • n=3>1,要执行fib(2)+fib(1),还是先处理左边的fib(2)。

步骤3:调用fib(2)

  • 压入fib(2),栈:[fib(4), fib(3), fib(2)]。
  • n=2>1,执行fib(1)+fib(0),先处理左边的fib(1)。

步骤4:调用fib(1)(第一次)

  • 压入fib(1),栈:[fib(4), fib(3), fib(2), fib(1)]。
  • n=1<=1,触发基准情况,返回1。此时fib(1)的栈帧被弹出,程序回到fib(2)里的1 + fib(0)这一步——现在要处理右边的fib(0)了。

步骤5:调用fib(0)

  • 压入fib(0),栈:[fib(4), fib(3), fib(2), fib(0)]。
  • n=0<=1,返回0。栈帧弹出,回到fib(2),计算1+0=1,返回1。fib(2)的栈帧弹出,回到fib(3)里的1 + fib(1)这一步。

步骤6:调用fib(1)(第二次)

  • 压入fib(1),栈:[fib(4), fib(3), fib(1)]。
  • 返回1,栈帧弹出,回到fib(3),计算1+1=2,返回2。fib(3)的栈帧弹出,回到fib(4)里的2 + fib(2)这一步——现在处理右边的fib(2)。

步骤7:调用fib(2)(第二次)

  • 压入fib(2),栈:[fib(4), fib(2)]。
  • n=2>1,执行fib(1)+fib(0):先调用fib(1)返回1,再调用fib(0)返回0,计算1+0=1,返回1。fib(2)的栈帧弹出,回到fib(4),计算2+1=3,返回3。
  • 此时栈里所有栈帧都被弹出,整个调用结束,最终结果是3。

关键分支逻辑总结

递归里的+号就是核心分支点:程序会先把左边的递归调用链全部走完(一直压栈到基准情况),等左边返回结果后,再走右边的递归调用链。

调用栈的“后进先出”特性正好适配这个逻辑:每次都是最深层的调用先返回,然后一步步往上回溯,把结果带回来,再触发另一个分支的调用。

另外你也能看出来,递归斐波那契效率低的原因——很多重复调用(比如fib(2)被调用了两次,fib(1)被调用了三次),每次重复调用都要走一遍压栈出栈的流程,这就是额外的开销。

内容的提问来源于stack exchange,提问作者Zubayer Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:50:08