用遞歸和非遞歸實現n的階乘(C語言實現)

遞歸和非遞歸實現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];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章