【LittleXi】阿克曼函数

阿克曼函数(AKM)

定义

阿克曼函数(Ackermann)是非原始递归函数的例子。它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常快,仅是对于(4,3)的输出已大得不能准确计算。

1.递归表达式

a k m ( m , n ) = { n+1  (m=0) akm(m-1,1)  (m不等于0,n=0) ; akm(m-1,akm(m,n-1))  (m不等于0,n不等于0) akm(m,n) = \begin{cases}\quad \text {n+1 \textcolor{red}{(m=0)}} \\ \quad \text{akm(m-1,1) \textcolor{red}{(m不等于0,n=0)};}\\ \quad\text{akm(m-1,akm(m,n-1)) \textcolor{red}{(m不等于0,n不等于0)}} \end{cases} akm(m,n)= n+1 (m=0)akm(m-1,1) (m不等于0,n=0);akm(m-1,akm(m,n-1)) (m不等于0,n不等于0)

2.代码实现

2.1递归写法:

思路:太easy了,略

int akm1(int m, int n)
{
    if (!m)
        return n + 1;
    if (!n)
        return akm1(m - 1, 1);
    return akm1(m - 1, akm1(m, n - 1));
}

2.2栈模拟写法:

思路:进行栈操作的时候,可以把即将需要操作的m放在栈顶,n放在栈顶下面,当进行akm第三项递归的时候,我们可以把多余的m-1放在栈里面(方便之后操作),再放即将被操作的m,n,当遇到m为0的时候,直接舍去m,把之前栈里面的m取出来,再和n-1配成一对进行操作。

int akm2(int m, int n)
{
    stack<int> sta;
    sta.push(n);
    sta.push(m);
    int ans = 0;
    while (sta.empty()!=1)
    {
        
        if (sta.size() == 1)
            ans = sta.top();
        int m = sta.top();
        sta.pop();
        int n = sta.top();
        if (!m)
        {
            if (sta.size() == 1)
                return sta.top() + 1;
            sta.pop();
            m = sta.top();
            sta.pop();
            sta.push(n + 1);
            sta.push(m);
            continue;
        }
        if(n == 0)
        {
            sta.pop();
            if (sta.size() == 1)
                ans = sta.top();
            sta.push(1);
            sta.push(m - 1);
            continue;
        }
        sta.pop();
        if (sta.size() == 1)
            ans = sta.top();
        sta.push(m - 1);
        sta.push(n - 1);
        sta.push(m);
        if (sta.size() == 1)
            ans = sta.top();
    }
    return ans;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值