我正在学习递归函数,但我只是不明白结果
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);
您将获得:
### ## #
#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);
您将获得:
### ## #