c语言递归的问题

long fact (int n) //使用递归算法计算阶乘
{
long ans;
if (n>0)
ans = n*fact(n-1);
else
ans = 1;
return 0;
}
以上代码是被调用函数定义,我想知道这个函数工作的每一步,以及原理。

递归就是调用自己的意思,而且你写错了,应该是return ans;返回值是自己,而不是0;比如说,实参传递形参给它n=2;
你如果觉得调用自己不明白的话,你就把上面的函数定义成:
fact1,fact2,fact3他们只是名字不一样,自定义函数的内容都是完全相同的。
然后自定义函数fact1开始运行:

n>0;成立,执行ans=n*fact2(n-1); //相当于ans=2*fact2(n-1);
ans这句语句调用fact2自定义函数,实参n-1=1传给fact2的形参。
n>0;成立,执行ans=*fact3(n-1); //这是n=1,形参收到的数据是1,1*fact3(n-1)
实参n-1=0传给fact3的形参;
n>0不成立,直接ans=1。
之前都是调用的过程,下面是返回值
先是从fact3返回1,返回到fact2,
fact2中ans=1*1=1,这个值返回到fact1;
fact1中ans=2*1=2,这个值返回到主函数。

同理,如果n=5的话,相当于要写fact1,fact2……fact6.这6个函数。
返回的结果是1*1*2*3*4*5=120到主函数。
但是如果你把这六个函数都写出来,要浪费多少时间,既然他们的内容都是一样的,为什么不把名字定为1个,然后自己调用自己,这就形成了递归函数了。
递归函数相当于调用多次自定义函数,而每次调用的对象都是同一个,只是每次传递的参数发生了变化。
希望你多看几遍,不明白继续问,纯手写,望采纳。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-02-01

按箭头来执行,其实内部用的是堆栈的知识。其实最关键的是何时才结束递归,对于此问题n<=0 时执行ans = 1返回;

追问

我还是不明白,它返回时是怎样计算得到120的,这个计算的过程有点理解不了,目前我对堆栈的知识还没学到。

第2个回答  2015-02-01
long fact (int n) //使用递归算法计算阶乘,也就是定义这样一个函数,接下来在大括号里来写这样一个long fact函数的功能
{
long ans;//定义一个长整型的ans
if (n>0)
ans = n*fact(n-1);//如果n大于0,执行ans = n*fact(n-1),并且一次一次执行下去。
else
ans = 1;如果n不大于0,就执行ans = 1
return 0;//最后返回0
}
第3个回答  2015-02-02
这个代码有错误,最后返回应该是return ans;而不应该是return 0;。
以6!为例:
ans=(6乘
(fact(5)乘
(fact(4)乘
(fact(3)乘
(fact(2)乘
(fact(1)乘
(fact(0)=1)))))))

最后由return ans;返回6x5x4x3x2x1x1=720。
第4个回答  2015-02-01
好象应该返回return ans;

相关了解……

你可能感兴趣的内容

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