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

多重递归调用疑问:left(9)执行后为何执行right(9)而非right(1)

递归调用中局部变量与栈帧的执行逻辑解释

首先看你提供的C++代码:

#include <iostream>

using namespace std;
int y(int i){
    cout<<i<<endl;
    i++;

    if(i==10){
        return 10000000;
    }
    int left=y(i);
    int right=y(i)+1;
    return right;

}
int main()
{
    cout<<y(1);

    return 0;
}

你疑惑的核心点:当left=y(9)执行完毕后,为什么接下来执行的是right=y(9)而非回到y(1)执行right=y(1),本质是没搞清楚递归栈帧的独立性和执行顺序:

  • 每个递归调用的函数都有独立的栈帧:每次调用y(i),系统都会为这个调用创建一个单独的栈帧,里面存储着该调用的局部变量(比如i)、执行到的代码位置等信息,不同栈帧的i完全独立,互不干扰。
  • 栈是后进先出的执行路径:递归调用是层层嵌套的,当最内层的y(9)执行完毕返回,只会回到调用它的直接上层栈帧(也就是y(8)的栈帧),而不是跳回最开始的y(1)。

具体拆解执行流程:

  1. 初始调用y(1):输出1,i自增为2,不满足i==10,于是执行int left=y(i);,调用y(2),此时y(1)的执行暂停,等待y(2)返回。
  2. y(2):输出2,i自增为3,调用y(3),执行暂停。
  3. 以此类推,直到调用y(9):输出9,i自增为10,触发return 10000000,直接返回给上层调用。
  4. 回到y(8)的栈帧:此时y(8)已经拿到left的值(10000000),接下来执行int right=y(i)+1;——这里的i是y(8)栈帧里的局部变量,已经被自增到9了,所以调用y(9),而非回到y(1)。
  5. y(9)再次返回10000000,y(8)计算出right=10000000+1=10000001,返回给y(7);以此类推,所有栈帧依次弹出,最终y(1)返回的是最后计算的right值。

简单总结:递归的栈是一层一层“叠”上去的,弹出时也是一层一层“拆”下来,每拆一层就继续执行该层未完成的代码,不会直接跳回最底层的初始调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:17:00