递归函数执行疑问:draw(n-1)后n值变化及for循环i的问题
递归调用中变量n的取值变化原因解析
我正在学习递归知识点,使用以下C语言代码:
#include <stdio.h> #include <cs50.h> void draw(int n); int main(void) { int height = get_int("number:"); draw(height); } void draw(int n) { if(n <= 0) { return; } draw(n - 1); for(int i = 0 ; i < n ; i++) { printf("#"); } printf("\n"); }
假设输入为4,调试时发现编译器完成if判断部分后n的值为0并返回,但随后for循环启动时n的值变为1,且i始终为0。我原本预期draw(n-1)执行完成后n的值应该是0,想请教这一现象的原因。
递归的核心是每一层调用都有独立的函数栈帧,每个栈帧里的n都是独立的局部变量,相互之间不会影响。
当输入为4时,整个递归调用的执行流程是这样的:
- 首先进入
draw(4),判断4>0,执行draw(3); - 进入
draw(3),判断3>0,执行draw(2); - 进入
draw(2),判断2>0,执行draw(1); - 进入
draw(1),判断1>0,执行draw(0); - 进入
draw(0),触发if(n<=0)条件,直接返回,回到上一层的draw(1)函数; - 此时
draw(1)栈帧里的n本来就是1(这个n是draw(1)自己的局部变量,和draw(0)里的n完全是两个不同的变量),所以开始执行for循环,打印1个#; - 完成
draw(1)的循环后,回到draw(2),它的n是2,执行循环打印2个#; - 以此类推,直到回到
draw(4),打印4个#。
你调试时看到的n=0是draw(0)函数里的局部变量,返回后切换到了draw(1)的栈帧,这里的n从一开始就是1,并不是“变成1”。而i始终为0是因为每次进入新的for循环时,i都会被重新初始化为0,这是for循环的正常初始化逻辑。
内容的提问来源于stack exchange,提问作者Rufus
相关产品推荐
相关产品推荐

