Ackerman的遞迴與非遞迴演算法

2021-07-05 13:05:49 字數 1753 閱讀 4775

已知ackerman函式的定義如下:

a km

(m,n

)=n+1, & \text \\ akm(m-1,1),& m \neq 0, \, n = 0 \\ akm(m-1,akm(m,n-1)),& m \neq 0, \, n \neq 0 \end

akm(m,

n)=⎩

⎪⎨⎪⎧

​n+1

,akm

(m−1

,1),

akm(

m−1,

akm(

m,n−

1)),

​m = 0m

​=0,

n=0m

​=0

,n​

=0​請設計對應的遞迴演算法和非遞迴演算法。

//ackerman遞迴演算法

int akm1(int m,int n)

}

//ackerman非遞迴演算法

int akm2(int m,int n)st[maxsize];

int top=-1; //棧指標

top++; //初值進棧

st[top].vm=m; st[top].vn=n; st[top].tag=1;

while(top > -1)

else if (st[top].vn==0) //(2)式

else //(3)式

}else if (st[top].tag==0) //已計算出vf值

else if (top > 0) //(3)式

}if(top==0 && st[top].tag==0) //棧中只有乙個已求出vf的元素時退出迴圈

break;

} return st[top].vf;

}

完整**如下:

#include #define maxsize 100

//ackerman遞迴演算法

int akm1(int m,int n)

}//ackerman非遞迴演算法

int akm2(int m,int n)st[maxsize];

int top=-1; //棧指標

top++; //初值進棧

st[top].vm=m; st[top].vn=n; st[top].tag=1;

while(top > -1)

else if (st[top].vn==0) //(2)式

else //(3)式

}else if (st[top].tag==0) //已計算出vf值

else if (top > 0) //(3)式

}if(top==0 && st[top].tag==0) //棧中只有乙個已求出vf的元素時退出迴圈

break;

} return st[top].vf;

}void main()

效果如下:

圖(1) ackerman遞迴演算法

圖(2) ackerman非遞迴演算法

遞迴與非遞迴習題

1.遞迴和非遞迴分別實現求第n個斐波那契數。includeint fib int n else 可以跳n節台階 是2 fib n 1 int main includeint fib int n if n 1 n 2 return 1 while a return f3 int main 2.編寫乙個...

遞迴與非遞迴演算法

一 題目分析 將非負十進位制整n轉換成b進製 其中b 2 16 將任意正整數n用2的冪次方表示 二 演算法設計 1 轉換進製問題 exer.cpp 遞迴演算法 遞迴出口 n b b 遞迴表示式 f n,b f n b,b n b b 遞迴棧表示 2 用二的冪次方表示任意正整數n問題 exer2.cp...

遞迴 非遞迴

遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如 hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此 在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問題 另外,有些程式語言不支援...