3.9アッカーマン関数の再帰的および非再帰的アルゴリズム

アッカーマン関数は次のように定義されることが知られています。
ここに画像の説明を挿入

①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]);
}

おすすめ

転載: blog.csdn.net/qq_39688282/article/details/108286224