【问题描述】已知Ackerman函数定义如下:
(1)根据定义,写出它的递归求解算法;
(2)利用栈,写出它的非递归求解算法。
【解答】
(1)递归实现
int Ackerman(int m,int n)
{
if(m==0) return n+1;
if(n==0) return Ackerman(m-1,1);
return Ackerman(m-1,Ackerman(m,n-1));
}
(2)非递归实现:
设m=2,n=1,分析算法的递归过程如下图:
可利用栈记忆各层结点的m,n值。每个结点2个域,分别记录m,n。如下所示:
代码如下:
int Ackerman(int m, int n) {
int i, j, k, top = -1;
int Sm[100], Sn[100];
Sm[++top] = m; Sn[top] = n; //Sm,Sn是栈,top是栈顶指针
while (1) {
i = Sm[top]; j = Sn[top]; top--; //出栈
if (i == 0) { //m=0
k = j + 1;
if (top != -1) Sn[top] = k;
else return k;
}
else if (j == 0) { //m!=0,n=0
Sm[++top] = i - 1;
Sn[top] = 1;
}
else { //m!=0,n!=0
Sm[++top] = i - 1;
Sm[++top] = i;
Sn[top] = j - 1;
}
}
}