有关c语言递归的问题!

来源:百度知道 编辑:UC知道 时间:2024/06/30 16:23:41
比如有这段程序:
fact(int n)
{int t;
if(n==1||n==0) t=1;
else t=n*fact(n-1);
return t;
}
当n=1时递归结束。我就想问当n=1时,之后程序会干些什么?现在假设n=5,会返回5个t出来吗,那是怎么返回出来的呢?
对liuyang_wddx说:它为什么要逆推回去呢,从哪一条语句可以体现出来?或者说这递归就是要这样,我搞不明白它为什么有这功能。

递归函数求fact(5)
当然不会返回五个值,当n=5时,if不会执行,if执行只会在n=0或n=1,执行else语句,就是5*fact(4)
但是现在不知道fact(4)是多少
程序开始计算fact(4)
4不是1或0
执行else的4*fact(3)
但是fact(3)计算机又不知道等于多少
又要去先计算fact(3)
同理一直到可以得到明确的fact(n)为止
当然这个fact(n)就是fact(1)或是fact(0)
得到了之后在按照上面的过程逆推回去,就可以得到fact(5)的值了
是怎么样回去的呢
求解可以分为两个阶段:第一个阶段是回推,将f
(5)表示成5*f(4),f(4)不知道,还要继续回推到f(3).........一直回推到f(1),此时f(1)知道了,不用在回推了。然后开始第二阶段,采用递推方法(函数递归的实质,也就是你说的为什么要逆推回去,这是发明人赋予的特殊功能,没有为什么,本质就在此,你要理解递归的意义),从f(1)推到了f(2),从f(2)推f(3)......一直到f(5),显而易见要是没有结束递归的f(1),第一阶段将无限制进行下去,所以函数递归必须要要结束条件。还有一点,函数递归的执行效率是很低的,要是你要求f(10000),那可能你一天也算不完,因为求f(10000),你必须求出所有的f(n)n=1--10000,只是个艰巨的过程,所以建议你不到万不得已的情况下不要用函数递归,恩,就这么多了,还不懂的话,可以去问问你们的老是,祝你好运!

恩,你说对了就是返回 5个t,
到n =5 时,他会首先执行 else 后面的语句 t就被赋值为
5*fact(5-1) 其中 fact(5-1)继续调用fact函数,此时相当与n=4;
t被赋值为4*fact(4-1)(注意这里的t和上一次的t是不一样的,
不要混浊)为了区别就吧他当成t2;
同理继续调用fact函数,知道n=1时,之时返回t5=1;
调用他的函数 t4就 = 2*fact(1) =2*1; fact(1)=t5 =1;

并返回t4;