理解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); }