#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..于是得到最终结果