アッカーマン関数は次のように定義されることが知られています。
①Ack(m、n)を計算するための再帰的アルゴリズムを記述し、このアルゴリズムに従ってAck(2,1)の計算プロセスを与えます。
②Ack(m、n)を計算するための非再帰的アルゴリズムを記述します。
①Ack(m、n)の再帰的アルゴリズムとAck(2、1)の計算過程
/*
Ack(m,n)的递归算法
*/
int Ack(int m,n){
if (m==0) return(n+1);
else if(m!=0&&n==0) return(Ack(m-1,1));
else return(Ack(m-1,Ack(m,n-1));
}
/*
Ack(2,1)的计算过程
*/
Ack(2,1)=Ack(1,Ack(2,0))
=Ack(1,Ack(1,1))
=Ack(1,Ack(0,Ack(1,0)))
=Ack(1,Ack(0,Ack(0,1)))
=Ack(1,Ack(0,2))
=Ack(1,3)
=Ack(0,Ack(1,2))
=Ack(0,Ack(0,Ack(1,1)))
=Ack(0,Ack(0,Ack(0,Ack(1,0))))
=Ack(0,Ack(0,Ack(0,Ack(0,1))))
=Ack(0,Ack(0,Ack(0,2)))
=Ack(0,Ack(0,3))
=Ack(0,4)
=5
②Ack(m、n)非再帰的アルゴリズム
/*
Ack(m,n)的非递归算法
*/
int Ack(int m,int n){
int a[M][N];
int i,j;
for(j=0;j<N;j++){
a[0][j]=j+1;
}
for(i=1;i<m;i++){
for(j=1;j<N;j++){
a[i][j]=a[i-1][a[i][j-1]];
}
}
return(a[m][n]);
}