【发布时间】:2022-01-01 04:23:16
【问题描述】:
我需要找到阿克曼函数的优化并解释阿克曼问题本身的问题。但是,我不确定我应该从哪里开始。我知道阿克曼函数的增长速度比任何原始递归函数都快。也许使用 BigInteger 存储结果会有所帮助?或者也许使用记忆?
例如,如果我们知道 A(0,1) = 1+1, A(1,0) = A(0,1), A (1,1) = A(0,A(1,0)) 我可以根据“n”从那里构建。
这听起来合理还是无法实现?是什么实际问题导致它即使对于少量数字也能如此快速地增长?
class Ackermann
{
static int ack(int m, int n)
{
if (m == 0)
{
return n + 1;
}
else if((m > 0) && (n == 0))
{
return ack(m - 1, 1);
}
else if((m > 0) && (n > 0))
{
return ack(m - 1, ack(m, n - 1));
}else
return n + 1;
}
public static void main(String args[])
{
System.out.println(ack(1, 2));
}
}
【问题讨论】:
-
只有小的 m 才能给出足够小的结果而不会溢出 int,并且您可以对这些值的计算进行硬编码(有关该函数的信息,请参见维基百科页面上的“值表”)。即使使用 bignums,也无法到达 Ackerman(5, 0) 或 Ackerman(4, 3)。
标签: algorithm optimization ackermann