求教c语言递归调用啊!!
c语言吧
全部回复
仅看楼主
level 5
游隼烈天 楼主
本人是自学的c语言.看到前面靠着习题跟书本都还可以,就是到了递归调用地方就不懂了,不明白递归调用是怎么运行的,还有找不出与数学知识的连接,望高手帮忙解释下啊,越全面越好 万分感谢
2007年11月13日 01点11分 1
level 1
本来吧里肯定有这方面的内容;但俺早上起来;很闲,呵呵;就给你扯扯;什么是递归?怎么实现递归?好把这个问题说清楚;我们先来看看其他一些基本内容:程序是怎么样运行的?我们知道我们写程序的时候总有些变量以及对这写变量执行操作的代码;代码是都是一个一个涵数来组织的;我们可以把这些涵数成为功能模块;跟专业的说法是成为线程.涵数中的变量跟那写对数据执行操作的代码是分别存放在不同的内存块的;局部变量我们存放在栈;全局变量存放在堆;栈是线成专用的;所以局部变量有局部性;只能在本涵数里操作;在调用一个方程的时候;要给传参数;一般的情况是参数被传到栈里;然后参数的下面给方程开辟栈;所以方程能知道参数压在哪里;好知道是这样以后;我们来写一个程序使用递归来实现N的阶乘;N!=N*(N-1)*(N-2)....*2*1;程序如下;#include
int func(int n){if(n==0) //N是零了吗?是就返回1.return 1;return n*func(n-1); //不是就调用FUNC(N-1)}void main() { int n=4; printf("result is %d",func(n));} 这里面func(n-1)就是在使用递归;为了更形象一点;我使用图片来解释:首先第一步在main()里调用func(n)此时候参数为4;所以不会执行return 1;但参数4已经被压在它的栈低下面了(参数压栈后才到线程的栈底哦)接着执行4*func(3);但要执行本式子的话;但先算出func(3);所以有去调用func(3);参数3又被压到栈底下面使用;但这次的栈给上面的栈是不同的;所以上面的参数4还能保存在;不被破坏.此时候参数为3;所以不会执行return 1;接着执行3*func(2);但要执行本式子的话;但先算出func(2);所以有去调用func(2);参数2又被压到栈底下面使用;但这次的栈给上面的栈是不同的;所以上面的参数3还能保存在;不被破坏.此时候参数为3;所以不会执行return 1;接着执行2*func(1);但要执行本式子的话;但先算出func(1);所以有去调用func(1);参数1又被压到栈底下面使用;但这次的栈给上面的栈是不同的;所以上面的参数2还能保存在;不被破坏.此时候参数为1;所以不会执行return 1;接着执行1*func(0);但要执行本式子的话;但先算出func(0);所以有去调用func(0);这次参数为0;所以返回1;返回后;程序运行到哪里?在哪里调用就返回到那里!!!所以返回到func(1)里面的1*func(0);在func(1)执行1*1;后返回.这次返回到哪里?当然是在哪里被调用就返回到哪里!!!所以返回到func(2)里的2*func(1);算出结果2*1*1.所以返回2*1*1;这次返回到哪里?当然是在哪里被调用就返回到哪里!!!所以返回到func(3)里的3*func(2);算出结果3*2*1*1.所以返回3*2*1*1;这次返回到哪里?当然是在哪里被调用就返回到哪里!!!所以返回到func(4)里的4*func(3);算出结果4*3*2*1*1.所以返回4*3*2*1*1;这次返回到哪里?当然是在哪里被调用就返回到哪里!!!所以返回到main()里的printf(....)!!!在本程序中就是先把所有东西列出来;在往回计算.呵呵 ,就是这样.
2007年11月13日 03点11分 3
level 0
写的太明白了!
2010年02月02日 17点02分 4
level 5
回复:3楼
[Love][Love][Love]
2010年02月03日 11点02分 5
level 0
赞个
2010年02月09日 01点02分 6
level 4
赞起
2010年02月09日 07点02分 7
level 5
赞起,楼下队形
2010年02月09日 10点02分 8
level 0
2005-12-4 13:43:00
通俗的语言描述递归:
利国利民的三农政策从中央传递到地方(省=》市=县》乡=》镇=》村支部),村支部严格执行三农政策,百姓富裕了,好!村支部汇报成绩到镇,镇汇报到乡,乡汇报到县,县汇报到市,市汇报到省,最后传人中央,中央说:结果处理好了,去打印吧!

2010年02月10日 05点02分 9
level 0
支持,我本来不懂的,但现在…嘿嘿!
2010年05月08日 02点05分 10
level 4
厉害啊!我也懂了,赞起!
2010年05月08日 02点05分 11
level 1
牛X的讲解,我终于看懂了!!!。。。。。。。。。。。。。。。。。。。。。。。
2010年08月25日 12点08分 12
level 6
递归的定义:
如果你还没有明白“递归“是什么的话,参见“递归“
2010年08月25日 12点08分 13
level 1
"所以有去调用func(2);
参数2又被压到栈底下面使用;但这次的栈给上面的栈是不同的;所以上面的参数3还能保存在;不被破坏.
此时候参数为3;
所以不会执行return 1;
接着执行2*func(1);
但要执行本式子的话;但先算出func(1); "
这一段中“此时候参数为3; ”
此时候的参数为2了吧?
我也是看书看到递归不太明白,在网上找的资料
感觉上面讲的很棒。
2011年01月28日 17点01分 14
level 1
顶一个~~~
2011年06月15日 12点06分 15
level 5
直接给你上图片。。。
2011年06月15日 14点06分 16
level 6
有种钻死脑筋的想法,
总感觉这道题在写代码的时候用不上。
谁用上的说一下。
2011年08月13日 00点08分 17
level 10
2L+1
2011年08月13日 02点08分 18
level 1
2011年08月14日 12点08分 19
level 8
用栈解释确实合适。
2011年08月14日 14点08分 20
level 1
赞起
2011年09月02日 14点09分 21
1 2 尾页