在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.
所以,废话了大半天,就是,递归一定要有出口。楼主仔细体会体会,不是死循环,是出口,到某一条件能得到结果。
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时断开
}
改为:
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;
不能漏掉递归结束条件。
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);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯