递归和非递归实现N的阶乘:
/*包含头文件*/
#include <stdio.h>
#define MAXSIZE 100
//递归函数与非递归函数声明
int fact1(int n);
int fact2(int n);
int main()
{
int f, n;
printf("请输入一个正整数(n<15): ");
scanf("%d", &n);
printf("递归实现n的阶乘:");
f=fact1(n);
printf("n!=%4d\n",f);
f=fact2(n);
printf("非递归实现n的阶乘:");
printf("n!=%4d\n",f);
return 0;
}
int fact1(int n)//n的阶乘递归实现
{
if (n<=1) return 1;//递归函数出口,n=1时,返回上一层
else return n*fact1(n-1);//把一个规模为n的问题转化为规模为n-1的问题
}
int fact2(int n)//n的阶乘非递归实现
{
int s[MAXSIZE][2],top=-1;//定义一个二维数组,并将栈顶指针置为-1
top++;//栈顶指针+1,将工作记录入栈
s[top][0]=n;//记录每一层的参数
s[top][1]=0;//记录每一层的结果返回值
do
{
if(s[top][0]==1) s[top][1]=1;//递归出口
if(s[top][0]>1&&s[top][1]==0)//通过栈模拟递归的递推过程,将问题依次入栈
{
top++;
s[top][0]=s[top-1][0]-1;
s[top][1]=0;//将结果置为0,还未返回结果
}
if(s[top][1]!=0)//模拟递归的返回过程,将每一层调用的结果返回
{
s[top-1][1]=s[top][1]*s[top-1][0];
top--;
}
}while(top>0);
return s[0][1];
}