ackerman函数递归,用栈非递归,不用栈递归三种方式

 

#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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值