多重递归调用疑问: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)。
具体拆解执行流程:
- 初始调用
y(1):输出1,i自增为2,不满足i==10,于是执行int left=y(i);,调用y(2),此时y(1)的执行暂停,等待y(2)返回。 y(2):输出2,i自增为3,调用y(3),执行暂停。- 以此类推,直到调用
y(9):输出9,i自增为10,触发return 10000000,直接返回给上层调用。 - 回到
y(8)的栈帧:此时y(8)已经拿到left的值(10000000),接下来执行int right=y(i)+1;——这里的i是y(8)栈帧里的局部变量,已经被自增到9了,所以调用y(9),而非回到y(1)。 y(9)再次返回10000000,y(8)计算出right=10000000+1=10000001,返回给y(7);以此类推,所有栈帧依次弹出,最终y(1)返回的是最后计算的right值。
简单总结:递归的栈是一层一层“叠”上去的,弹出时也是一层一层“拆”下来,每拆一层就继续执行该层未完成的代码,不会直接跳回最底层的初始调用。
内容的提问来源于stack exchange,提问作者Anish
相关产品推荐
相关产品推荐

