用Java编写的标准Ackermann公式:
public static int ack(int x, int y) {
if (x == 0) {
return y + 1;
} else if (y == 0) {
return ack(x-1, 1);
} else {
// perforce (x > 0) && (y > 0)
return ack(x-1, ack(x,y-1));
}
}
我一直在想 - 是否有更快的版本来实现这个?我想也许有使用累加器或循环。
答案 0 :(得分:3)
是的,例如"作弊"。如果m
为5或更高,则int
无法表示任何结果。对于m = 4
,只能表示n < 2
个案例。对于m < 4
,有基于n
的简单封闭公式。
无论如何,其他所有东西都会溢出,所以让我们假设这些情况甚至不会发生(或者你可能会抛出错误或其他)。
未经测试:
int Ackerman(int m, int n) {
switch (m) {
case 0:
return n + 1;
case 1:
return n + 2;
case 2:
return n * 2 + 3;
case 3:
return (int)((1L << (n + 3)) - 3);
case 4:
return n == 0 ? 13 : 65533;
}
}
答案 1 :(得分:2)
我可以告诉你一件事...... int
不足以满足很多x和y的值
如果您要重复调用该函数,可以创建一个int[][]
数组来存储各种值,这样您就可以在第二个+时间查找它们,只需要计算一次。但至于加速单次执行......不确定。
答案 2 :(得分:1)
这种变化更快:
public static int ack(int x, int y) {
while (x != 0) {
y = y == 0 ? 1 : ack(x, y - 1);
x--;
}
return y + 1;
}