#include<bits/stdc++.h>
using namespace std;
#define MAXN 1005
int akm1(int m,int n){ //递归算法
if(m==0){
return n+1;
}
else if(m!=0&&n==0){
return akm1(m-1,1);
}
else if(m!=0,n!=0){
return akm1(m-1,akm1(m,n-1));
}
}
int akm2(int m,int n){ //利用栈的非递归算法
int stack1[10005]; //stack1存储的是m
int stack2[10005]; //stack2存储的是n
int len1=0;
int len2=0;
stack1[len1++]=m;
stack2[len2++]=n;
while(len1!=0){
while(m!=0){ //第二第三章情况都往里放
if(n==0){ //第二种情况
m=m-1;
n=1;
stack1[len1++]=m;
stack2[len2++]=n;
}
else{
n=n-1;
stack1[len1++]=m-1;
stack2[len2++]=-1; //空出一个待定值表示是第三种情况
}
}
n=n+1; //到达了m=0的情况
while((len1!=0)&&(stack2[len2-1]!=-1)){ //若是为待定处就可以直接往前退
len1--;
len2--;
}
if(len1!=0){ //这个时候把n弄上去,进行下一次的推算
m=stack1[len1-1];
stack2[len2-1]=n;
}
}
return n;
}
int akm3(int m,int n){ //不用栈的非递归算法,使用二维数组递推实现
int akm[m+1][MAXN];
memset(akm,0,sizeof(akm));
for(int i=0;i<=MAXN;i++){
akm[0][i]=i+1;
}
for(int i=1;i<=m;i++){
akm[i][0]=akm[i-1][1];
for(int j=1;j<=MAXN;j++){
akm[i][j]=akm[i-1][akm[i][j-1]];
}
}
return akm[m][n];
}
int main(){
cout<<akm1(4,0)<<endl;
cout<<akm2(4,0)<<endl;
cout<<akm3(4,0)<<endl;
cout<<akm1(2,2)<<endl;
cout<<akm2(2,2)<<endl;
cout<<akm3(2,2)<<endl;
system("pause");
return 0;
}