我正在学习递归函数,但我只是不明白结果

I'm learning recusive function and I just don't understand the result

#include <cs50.h>
#include <stdio.h>

void draw(int h);
int main(void)
{
    int height = get_int("Height: \n");
    draw(height);
}

void draw(int h)
{
    if (h ==0)
    {
        return;
    }
    draw(h - 1);
    for (int i = 0; i < h; i++)
    {
        printf("#");
    }
    printf("\n");

}

所以它打印出“# ## ### ####” (Space 是每一行)我不明白 draw(height),它一直减到 0,但是 for 循环如何打印这样的散列?就像它如何在递归函数减去它为 0 后在增加的行中打印?请逐步解释它是如何工作的,提前谢谢你。

第一次调用draw()执行打印行会是draw(1),因为你首先调用draw(h - 1),所以调用会在栈中堆叠,然后在 for.

之前执行

尝试简化序列:

=> draw(3);
==> Calls: draw(2);
===> Calls: draw(1);
====> Calls: draw(0) <=== return to [draw(1)];
===> draw(1): run the for ("#") <== return to [draw(2)]
==> draw(2): run the for ("##") <== return to [draw(3)]
=> draw(3): run the for ("###") <== return to first caller

结果:
# ## ###


为了更好的理解,可以切换draw(h - 1)for的顺序:

for (int i = 0; i < h; i++)
{
    printf("#");
}
draw(h - 1);

您将获得:
### ## #