理解C中的递归

这是一个递归程序。 但我不明白在这个项目中发生的事件顺序

#include count(int); main() { int x=5; count(x); } count(int y) { if(y>0) { count(--y); printf("%d ",y); } } 

输出是:

 4 3 2 1 0 ... 

但是我没有得到第一次调用count(5)和调用count(4)时会发生什么。 控件是否立即进入函数的开头? 或者首先它打印y的值然后再次进入函数count()的开头?

你可以轻松地逐步查看代码,看看那里发生了什么,使用了略微编辑的代码:

 #include void count(int); int main() { int x=5; count(x); } void count(int y) { if(y>0) { count(--y); printf("%d ",y); } } 

现在看看执行过程中会发生什么。 看到gdb会话:

 (gdb) b count Breakpoint 2 at 0x4004ea: file rc.c, line 10. (gdb) c Continuing. Breakpoint 2, count (y=5) at rc.c:10 (gdb) c Continuing. Breakpoint 2, count (y=4) at rc.c:10 (gdb) c Continuing. Breakpoint 2, count (y=3) at rc.c:10 (gdb) c Continuing. Breakpoint 2, count (y=2) at rc.c:10 (gdb) c Continuing. Breakpoint 2, count (y=1) at rc.c:10 (gdb) c Continuing. Breakpoint 2, count (y=0) at rc.c:10 (gdb) bt #0 count (y=0) at rc.c:10 #1 0x00000000004004fe in count (y=0) at rc.c:12 #2 0x00000000004004fe in count (y=1) at rc.c:12 #3 0x00000000004004fe in count (y=2) at rc.c:12 #4 0x00000000004004fe in count (y=3) at rc.c:12 #5 0x00000000004004fe in count (y=4) at rc.c:12 #6 0x00000000004004dd in main () at rc.c:6 (gdb) 

后面的痕迹讲述了整个历史。 看到每次调用计数都是“堆积”。 但没有人回来。 还没有打印出来。

现在看看他们如何一个接一个地回来:

 (gdb) n count (y=0) at rc.c:13 /* count(y = 0) returned first , it will not cause any printing*/ (gdb) n (gdb) n count (y=1) at rc.c:13 /* count(y = 1) returned second, this will cause printing 0 */ (gdb) n (gdb) n count (y=2) at rc.c:13 /* subsequent returns will cause printing of 1,2,3 etc */ (gdb) n (gdb) n count (y=3) at rc.c:13 (gdb) n (gdb) n count (y=4) at rc.c:13 (gdb) c Continuing. 0 1 2 3 4 

它就像一堆菜。

  1 2 3 4 5 count(0) count(1) count(1) count(2) count(2) count(2) count(3) count(3) count(3) count(3) main main main main main count(0) prints nothing 

转到第4步

 count(1) prints 1 

转到第3步

 count(2) prints 2 ... 

因此,要获得4 3 2 1的输出,您需要交换count(--y)printf("%d",y)行。

嗯,这就像算术进展。 从N> 0开始, 每次减去1直到达到0 。 更多关于递归的信息(使用factorial示例,你会理解): http : //en.wikipedia.org/wiki/Recursion

希望这有帮助。

问候。

 void count(int y) { if(y>0) { printf("%d ",--y); count(y); } } 

打印y-1,y-2,… 0。

如果y <= 0 ,则无事可做。 如果y > 0 ,则递减y打印递减的y ,然后使用递减的y值调用count以打印剩余的值。

另一个例子,这个:

 void count(int y) { if(y>0) { printf("%d ",--y); count(y); printf("amol"); } } 

打印y-1,y-2,... 0 amol ... amol(y次)。

它通过打印y-1来实现,然后递归调用count(y-1)来打印y-2,.0,amol(y-1次),然后打印剩余的“amol”。

程序可以通过用等价物替换事物来转换:变量及其值,带有函数代码的函数调用,带有所选代码的常量条件。 例如,

 main() { int x=5; count(x); } 

– >

 main() { count(5); } 

– >

 main() { if(5>0) { count(4); printf("%d ",4); } } 

– >

 main() { count(4); printf("%d ",4); } 

– >

 main() { if(4>0) { count(3); printf("%d ",3); } printf("%d ",4); } 

– >

 main() { count(3); printf("%d ",3); printf("%d ",4); } 

– > … – >

 main() { count(0); printf("%d ",0); printf("%d ",1); printf("%d ",2); printf("%d ",3); printf("%d ",4); } 

– >

 main() { if(0>0) { count(-1); printf("%d ",-1); } printf("%d ",0); printf("%d ",1); printf("%d ",2); printf("%d ",3); printf("%d ",4); } 

– >

 main() { printf("%d ",0); printf("%d ",1); printf("%d ",2); printf("%d ",3); printf("%d ",4); }