新人求解小疑问,C++的递归函数,自调求阶乘。

大佬们,菜鸟有个小问题, 如图,当主函数调用fac()函数时,一轮后,_f=5*4*3*2*1*f(0),即fac(0),也就是n==0,继续调用,这时执行if(n==0),f=1;这时就不会执行else了,所以返回f=1,不会继续执行fac(n-1)*n。_理论上是这样的啊,难道还有什么是我不知道的?图片说明

4个回答

随着n减小,函数不断调用自身。
n = 6时函数的return值要等待 n = 5 函数的return值,
n = 5时函数的return值要等待 n = 4 函数的return值,
.........
n = 1时函数的return值要等待 n = 0 函数的return值,
n = 0时函数的返回值f = 1求解得到。
然后再逐层返回。

递:传递。
归:回归。

再来张图

递归确实不太好理解,希望我的回答能在你理解递归的过程中有所帮助。

如果对您有帮助,请采纳答案好吗,谢谢!

qq_37980913
收音机丶 回复战在春秋: 我仔细理解下,搞定了,明白了,谢谢 。
2 年多之前 回复
fight_in_dl
战在春秋 还有一个办法,把n取小一点,设置断点,分步调试运行,观察变化。
2 年多之前 回复
fight_in_dl
战在春秋 递归确实不太好懂,暂时不太理解没关系,会有一个时候顿悟。到时请回来结一下这个题就行:)
2 年多之前 回复
fight_in_dl
战在春秋 if(n == 0) f =1 代码里不是有这一行吗?你再仔细看看。f(1)要等f(0)的结果,f(2)要等f(1)的结果 .....
2 年多之前 回复
qq_37980913
收音机丶 递归到最后时,f=5*4*3*2*1*fact(0):n=0,所以执行f=1,那么f=1和fact(0)有什么关系?为什么fact(0)会等于1?为什么还会执行没完成的阶乘?还是直接把f=1返回给主函数?不太明白,多多包含
2 年多之前 回复

第一次循环:fac(n)=n*fac(n-1)。
第二次循环:fac(n-1)=(n-1)*fac(n-2)。
。。。。。
第n次循环fac(1)=1*fac(0)
前面的循环都只是将公式分解,没有解出实际数据,直到最后才解出fac(0),然后回代求解fac(n)。
整个阶乘的解法就是fac(n)=n*fac(n-1)
=n*(n-1)*fac(n-2)
.......
=n*(n-1)*(n-2)*·····2*1*fac(0)
经过层层迭代,最后只剩下未知数fac(0),所以最后只要把fac(0)求出来,就可以解出fac(n)。对于阶乘而言,n=0,则fac(0)=1。

qq_37980913
收音机丶 (我是新人,所以有很多地方不太懂,请多多包含)这些我理解,fac(0),即if(n==0),f=1,这个有什么用?if和else这两个,只能执行其中一个,既然执行了if,那么else就不会被执行了啊,还怎么求fac(0)和阶乘?按逻辑是这样吧
2 年多之前 回复

当n>0时,将继续往下迭代,执行else语句,返回的是n*fac(n-1);当n=0,时,说明迭代已经进行到最后一步了,执行if语句,返回fac(0)。i
if语句只有n=0时才会执行,当n>0时,执行都是else语句啊。举个例子吧,5的阶乘:
第一次迭代分解fac(5):因为n=5,所以执行else语句,返回5*fac(4)。即fac(5)=5*fac(4),很显然,第一次迭代没有解出5的阶乘,但已经将5的阶乘分解为5乘以4的阶乘。此时,我们只要解出4的阶乘,即可算出5的阶乘,于是我们要进行第二次迭代来解决4的阶乘。第二次迭代分解fac(4):n=4>0,所以还是执行else语句,返回的是4*fac(3)。即fac(4)=4*fac(3),很显然,第二次迭代也没有解出fac(4),但已经将fac(4)分解为
4*fac(3)。我们需要进行下一个迭代来解决fac(3)。。。。。。直到第五次迭代,n=0,执行的if语句,返回fac(0)=1,这是一个确定的解,不需要继续迭代了。
换句话说,要求fac(5)就得求fac(4),要求fac(4)就得求fac(3),要求fac(3)就得求fac(2),要求fac(2)就得求fac(1),要求fac(1)就得求fac(0),
而fac(0)是可以直接求出来的,那就是fac(0)=1;
要算出n的阶乘,fac(int n)这个函数需要执行n次,而不是只执行一次哦,每一次执行,要么是执行if之下的语句,要么就是执行else之下的语句。对于5的阶乘,前4次执行的是else之下的语句,其作用就是将公式分解。最后一次,执行的是if之下的语句,其作用就是解出fac(0)用于回代。

qq_37980913
收音机丶 我仔细理解下,搞定了,明白了,谢谢 。
2 年多之前 回复
qq_37980913
收音机丶 if(n==0)是个终止递归条件,终止后理应不会再执行else了啊,直接输出f=1,有点不太明白
2 年多之前 回复
qq_37980913
收音机丶 就是不明白为什么会有fac(0)=1,还有fac(0)为什么要用于回代,不是执行if后就直接返回f的值,就输出结果 ?请问我的理解是不是有错?还是怎样
2 年多之前 回复

就是一个大问题转换成等N多个小问题,小问题再展开讨论,这样的思路形成了,以后的递归都不会很难

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问