#include<iostream>
using namespace std;
/*问题描述
akm(m,n)=
1.当m==0时
n+1
2.当m!=0&&n==0时
akm(m-1,1)
3.当m!=0&&n!=0时
akm(m-1,akm(m,n-1))
*/
typedef struct Node
{
int m;
int n;
int sum;
int flag;
};
int AKM(int m, int n)
{
Node s[100];
int top = 0;
s[top].m = m;
s[top].n = n;
s[top].flag = 1;
s[top].sum = 0;
while (top != -1)
{
if (s[top].flag)
{
if (s[top].m == 0)
{
s[top].sum = s[top].n + 1;
s[top].flag = 0;
}
else
{
if (s[top].n == 0)
{
top++;
s[top].m = s[top - 1].m - 1;
s[top].n = 1;
s[top].flag = 1;
}
else
{
top++;
s[top].n = s[top - 1].n - 1;
s[top].m = s[top - 1].m;
s[top].flag = 1;
}
}
}
else
{
if (top > 0 && s[top-1].n== 0)
{
//则栈顶下面一元素的m必为1,此时直接赋值,并标记为已计算,出栈
s[top - 1].sum = s[top].sum;
s[top - 1].flag = 0;
top--;
}
else if (top > 0)
{ //栈顶为已计算的akm,栈顶下面一个元素akm为3式
//则三式逗号后akm即为栈顶已计算出的sum,直接赋值给n,出栈
s[top - 1].m = s[top - 1].m - 1;
s[top - 1].n = s[top].sum;
s[top - 1].flag = 1;
top--;
}
}
if (top == 0 && s[top].flag == 0) break;
}
return s[top].sum;
}
int main()
{
cout << AKM(4, 0);
}