已知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塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此 在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問題 另外,有些程式語言不支援...