C++ 关于阿克曼函数的非递归算法的程序已给出 其中的某些步骤还不太明白 求大神解答

/*先看一下标准阿克曼函数的实现
akm(m, n) = n + 1; (m = 0时)
akm(m, n) = akm(m - 1, 1); (n = 0时)
akm(m, n) = akm(m - 1, akm(m, n - 1)); (m != 0且n != 0时)*/
#include <iostream>
using namespace std;
int akm_nonrecursive(int m, int n)
{
int m1[50], n1[50], cp;

cp = 0;
m1[0] = m;
n1[0] = n;
do {
while (m1[cp] > 0)
{ //压栈, 直到m1[cp] = 0
while (n1[cp] > 0)
{ //压栈, 直到n1[cp] = 0
cp++;
m1[cp] = m1[cp - 1];
n1[cp] = n1[cp - 1] - 1;
cout<<"m1[cp]:"<<m1[cp]<<endl;
cout<<"n1[cp]:"<<n1[cp]<<endl;
}
cout<<"cp:"<<cp<<endl;
// 计算akm(m - 1, 1),当n = 0时
m1[cp] = m1[cp] - 1;
n1[cp] = 1;
}
// 改栈顶为akm(m - 1, n + 1),当m = 0时
cp--;
m1[cp] = m1[cp] - 1; //(2)
n1[cp] = n1[cp + 1] + 1; //(3)
} while (cp > 0 || m1[cp] > 0);

return n1[0] + 1;
}

int main()
{
cout<<akm_nonrecursive(3,2);
return 0;
}
//改栈顶为akm(m - 1, n + 1),当m = 0时
/*由公式知当m = 0时akm(m , n )=n+1所以直接把 m1[cp] =0;不就完了 为什么还要m1[cp] = m1[cp] - 1; 还有n1[cp] = n1[cp + 1] + 1; 直接n1[cp] = n1[cp ] + 1不就完了 为什么要n1[cp + 1]啊?语句(2)(3)不太明白啊*/

第1个回答  2012-06-11
这些问题最好就是在纸上画着来理解 一步一步来就清楚了追问

你要是知道这两步怎么来的 我可以提高悬赏

第2个回答  2012-06-11
学习了
相似回答