标准的阿克曼能被优化吗



用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));
        }
    }

我一直在想,有没有更快的版本来实现这一点?我在想可能有通过使用累加器或循环。

是的,例如通过"欺骗"。如果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;
    }
}

我可以告诉你一件事。。。int将不足以满足x和y 的许多值

如果要重复调用该函数,可以创建一个int[][]数组来存储各种值,这样就可以在第二次以上查找它们,只需要计算一次。但至于加快一次处决。。。不确定。

这种变化更快:

public static int ack(int x, int y) {
    while (x != 0) {
        y = y == 0 ? 1 : ack(x, y - 1);
        x--;
    }
    return y + 1;
}

相关内容

  • 没有找到相关文章

最新更新