新人求解小疑问,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。_理论上是这样的啊,难道还有什么是我不知道的?图片说明

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

递:传递。
归:回归。

再来张图

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

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

第一次循环: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。

当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)用于回代。

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