c函数的递归调用问题。如下面的代码。当满足f>1时,f=ff(n-1)*n;这个表达式是如何算n*(n-1)!的。

long ff(int n)
{
long f;
if(n<0) printf("n<0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
} 不知道详细过程。求高手解答。

我觉着自己是清楚的,但要给你说清楚可觉得还有一定难度,试一试,供参考。为方便述说,把你的代码的else if(n==0||n==1) f=1;称(1),else f=ff(n-1)*n;称(2),return(f);称(3)。
以n=3调用为例。
用3调用,直接到了(2),又以n-1=2调用自身再到(2);这时n=2了,又用n-1=1调用(这个过程中,(2)后面的*n都没有“来得及”做,只是在前面的ff(n-1)中一层一层地调用)。这时,(1)条件成立(n=1)了,所以例f=1,并用(3)句返回。返回到哪里去了?这是理解的关键之处——返回到(2)句用n-1=1调用的那一层上!这时返回值f=1,它要乘以n,n是多少呢?这又是关键——n=2,因为这一层是用n-1=1调用的,n自然等于2!那么(2)句f=ff(n-1)*n的实质就是f=f*n=1*2=2,接下来,用(3)将f=2返回。这次返回到(2)句n-1=2那一层上,这时n=3,与上面的过程一样得f=f*n=2*3=6,接着用(3)句返回。返回到哪里?这次返回到主调程序了,因为n=3是主程序调用的。
看来这段代码是一个整数阶乘递归算法。
(1)句的判断条件n==0干什么呢?它是解决数学上的特殊规定0!=1的,当用0调用时,直接由
(1)判断返回f=1。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-05
输入n,
返回f=ff(n-1)*n 用到了ff(n-1),于是再次调用函数ff(n-1),返回ff(n-2)*(n-1)
也就是f=ff(n-2)*(n-1)*n, 然后ff(n-2)继续调用ff函数,返回ff(n-3)*(n-2);
这样一直下去,调用调用ff(1),这时就直接输出1了,而不会继续调用ff函数。
从而最终输出为f=n*(n-1)*(n-2)*...*2*f(1)=n*(n-1)...*2*1=n!;本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网