阿克曼函数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]=2dp[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;
}
有帮助请点个赞谢谢!!