遞歸和非遞歸實現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];
}