永发信息网

递归函数的问题

答案:2  悬赏:0  手机版
解决时间 2021-05-09 18:03

#include<iostream.h>

long fact(int n){
cout<<n<<endl;
if(n==0)

{cout<<"if"<<endl;

return 1; } //递归终止条件
else
{n=n*fact(n-1); //递归调用
cout<<"n:"<<n*fact(n-1)<<endl;
}
return n;
}


void main(){
int n;
cout<<"input n:";
cin>>n;
cout<<"n!="<<fact(n)<<endl;

}

晕死了。如果能够画出来执行的流程图最好不过的了!!

最佳答案

这个函数有问题,问题出在else代码块中,


else {


n=n*fact(n-1); //注意这句话,这里将n赋值为n的阶乘,而紧接着用这个新的n调用一次fact,显然只要传入的n大于2,这个程序最将导致系统堆栈溢出
cout<<"n:"<<n*fact(n-1)<<endl;
}



note:


递归函数调用与普通函数调用原理是一样的,都得执行压栈操作,函数没有返回在系统栈上占用的空间就不会释放,每执行一次调用就会占用一些系统栈空间。



将函数改成如下:


long fact(int n){


int tmp; //分配一个临时变量
cout<<n<<endl;
if(n==0)


{cout<<"if"<<endl;

return 1; } //递归终止条件
else
{tmp=n*fact(n-1); //递归调用
cout<<"n:"<<tmp<<endl;
}
return tmp;
}

全部回答

很显然`这是一个算递归中最简单的算n!的问题。

不知道你学过高中的函数没,这里我以这样的方式给你讲解

已知f(x)=1且f(x)=f(x-1)*x;那么,求f(n);

这段代码写出来也就是你那俩句话。至于执行顺序么。

举例:n=5;调用函数f(5)

首先执行if()...判断n是否等于0。。。不成立,于是执行下面代码

f(5)=f(4)*5....此时遇到函数f(4)...调用该函数f(4):

此时,同样先判断4是否等于0。。不成立,于是执行下面代码

f(4)=f(3)*4....此时遇到f(3)...调用函数f(3)..

。。这样一直执行到调用函数f(1)=f(0)*1...

判断是否为0,成立,于是返回1。。。

代入上面的f(1)=f(0)*1...得到结果f(1)=1..再代入之前的式子f(2)=f(1)*2

于是得到f(2)=2.......一直到f(5)=f(4)*5..于是得到最终结果

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么个性签名保存不了?
手机号三连顺123的好456的好,急。。。
七年级的应用题
完美国际MG杀怪和其他职业比怎么样?
n97mini 被人换了主板里面安装的程序还会有么
阿斗当官下一句,接句,有一种一见钟情叫一眼万
吉山上街地址有知道的么?有点事想过去
世界上真的有增高药吗? 0
LG KP500 国庆前买的行货 什么都满好 昨天开
你好,关于系统开机黑屏的问题
描述唱歌心情好的句子,怎样用最美的句子来形
九阳豆浆机质量怎么样啊?
手指骨折还能恢复到和美骨折以前一样吗
天若有情天亦老 下一句什么?
过年回去奏干点什嘛?
推荐资讯
午后老是头疼是怎么了?有什么方法可以缓解呢
月收入多少 才适合买车?
为什么我的DNF号的伤害总是不跟别人一样?
为了爱情我们可以做些什么----
为什么诺基亚2630不能载08版手机QQ啊?
急!谁能给我一份民事诉讼中被告追加新被告,
梦诛怎么增加帐号的安全阿?..
提高个人修养,应从什么地方做起?
求一部比较不错索爱的,款式交新的手机,价格
求购废电线处理设备
SONY笔记本EA37玩游戏效果怎么样?
现在学生读什么科系,在社会上最受欢迎
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?