永发信息网

在c++的递归函数中fac(n)=fac(n-1)*n错在哪里

答案:4  悬赏:10  手机版
解决时间 2021-04-07 05:03
  • 提问者网友:寂寞撕碎了回忆
  • 2021-04-06 14:24
在c++的递归函数中fac(n)=fac(n-1)*n错在哪里
最佳答案
  • 五星知识达人网友:持酒劝斜阳
  • 2021-04-06 14:38
神马也别说,楼主采纳我吧

int fac(int n)
{
if(n==0||n==1)
return 1;
else
return fac(n-1)*n;

}追问为什么return fac(n-1)*n就正确而fac(n)=fac(n-1)*n return fac(n)不正确啊追答楼主,这样跟你解释吧。

如果 你要计算 5的阶乘 ,你是不是可以 说 等于 4的阶乘*5
然后计算4的阶乘,是不是可以说 3的 阶乘乘以2

计算机很笨的,一直直到你说1的阶乘是1 ,它再往上面返回。

如果你计算 5的阶乘,你告诉计算机,等于5的阶乘, 然后计算机又调用 fac(5),你又告诉它等于 fac(5),如此循环。。。死循环了

所以 fac(n)=fac(n-1)*n 就不一样 ,计算机求5的阶乘,然后知道要先求4的阶乘,然后知道先求3的阶乘,然后知道先求2的阶乘,然后知道求1的阶乘 ,然后调用fac(1),return 1.

所以,废话了大半天,就是,递归一定要有出口。楼主仔细体会体会,不是死循环,是出口,到某一条件能得到结果。
全部回答
  • 1楼网友:举杯邀酒敬孤独
  • 2021-04-06 16:41
应该是无限返回了。你求的是n!吧。
改为:
int fac(int n)
{
if(n==1)//当n==1时,返回的是一个值而不是函数
return n;
if(n>1)
return fac(n)=fac(n-1)*n;//返回函数递推,当n==1时断开
}
  • 2楼网友:醉吻情书
  • 2021-04-06 15:26
应该是:
if(n==0)fac=1;
else fac(n)=fac(n-1)*n;
不能漏掉递归结束条件。
  • 3楼网友:梦中风几里
  • 2021-04-06 15:17

么代码,一般都错在没有判定条件,从而使函数无法退出结束递归,应该这样写double fac(int n)
{
     double f;
     if (n==0||n==1)
        f=1;
     else
        f=fac(n-1)*n;
     return f;
}
类似的还有斐波那契数列
int fibo(int n)
{
    if(n==1)
        return 1;
    else if(n==2)
        return 1;
    else
        return fibo(n-1)+fibo(n-2);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯