AKC函数的堆栈解法
代码如下
#include<iostream>
#include<stack>
using namespace std;
stack<int> s;
int number = 0;
struct val
{
int m;
int n;
};
val NextVal(val in,stack<int>&s)
{
val out;
if (s.empty() && in.m == 0) //s为空时介绍算法
{
out.n = in.n + 1;
out.m = -1;
number++;
return out;
}
else if (in.m == 0)
{
out.n = in.n + 1; //开始出栈,计算上一层函数的值
out.m = s.top();
s.pop();
number++;
return out;
}
else if (in.n == 0)
{
out.m = in.m - 1; //当n=0时,下一个m等于m-1,n=1
out.n = 1;
number++;
return out;
}
else
{
s.push(in.m - 1); //m,n均不为0时,第一个数入栈,计算第二个数,即A(m,)
out.m = in.m;
out.n = in.n - 1;
number++;
return out;
}
}
int Akm(int m, int n)
{
val test;
test.m = m;
test.n = n;
int i = 0;
while (test.m != -1)
{
//i++;
test = NextVal(test,s);
}
//cout << i << endl;
return test.n;
}
int main()
{
cout << Akm(2,1) << endl;
cout << number << endl;
system("pause");
}
AKC函数介绍
Ackermann函数定义如下:若m=0,返回n+1。
若m>0且n=0,返回Ackermann(m-1,1)。
若m>0且n>0,返回Ackermann(m-1,Ackermann(m,n-1))。
为什么不使用递归
使用递归,由于系统分配的栈空间有限,需要存储冗余的函数信息,故无法计算较大的数值。而直接使用递归解法可以有效的解决这个问题。
手动解–写法如下