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

递归函数执行疑问: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:55:17