阿克曼函数Ackerman

阿克曼函数Ackerman

同样是算法课后小作业,之前还没见过这个函数(是我孤陋寡闻了)

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

递归公式
在这里插入图片描述

上代码,这是递归方法,acm用这个方法的话通常会超时,因为一般m=3这个数就很大要算很多次的,所以一般m都取0~3

	public static long ackerman(long m, long n) {
        if (m < 0 || n < 0)
            return -1;
        else if (m == 0)
            return n + 1;
        else if (m > 0 && n == 0)
            return ackerman(m - 1, 1);
        else  //m>0 and n>0
            return ackerman(m - 1, ackerman(m, n - 1));
    }

m只能取0、1、2、3,这样就可以把m的所有情况列出来了
推导m=1时要结合m=0时推
推导m=2时用m=1时 同理可得到
m=0 n+1;
m=1 n+2;
m=2 2n+3
m=3 dp[3][i]=2
dp[3][i-1]+3;

	public static long ackerman(long m, long n) {
        if (n == 0)
            return ackerman(m - 1, 1);
        else if (m == 0)
            return n + 2;
        else if (m == 1)
            return n + 2;
        else if (m == 2)
            return 2 * n + 3;
        else if (m == 3)
            return ackerman(m, n - 1) * 2 + 3;
    }

有帮助请点个赞谢谢!!
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值