Java 标准阿克曼能被优化吗?

Java 标准阿克曼能被优化吗?,java,performance,optimization,ackermann,Java,Performance,Optimization,Ackermann,用Java编写的标准阿克曼公式: 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)

用Java编写的标准阿克曼公式:

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

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

我可以告诉你一件事
int
对于x和y的很多值都不够


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

我可以告诉你一件事
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;
}

这种变化更快:

public static int ack(int x, int y) {
    while (x != 0) {
        y = y == 0 ? 1 : ack(x, y - 1);
        x--;
    }
    return 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;
    }
}
intackerman(intm,intn){
开关(m){
案例0:
返回n+1;
案例1:
返回n+2;
案例2:
返回n*2+3;
案例3:
返回(int)((1L是,例如通过“作弊”。如果
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;
    }
}
intackerman(intm,intn){
开关(m){
案例0:
返回n+1;
案例1:
返回n+2;
案例2:
返回n*2+3;
案例3:

返回(整数)((1L我可能会问,这有什么意义?我所听说的Ackermann函数唯一真正的非理论用途是作为算法运行时的上界。玩具实现是否快速真的很重要吗?我想这里的另一个问题是,为什么你今天问了两次这个问题?一次是java,一次是scheme?另一个问题是n、 你得到了基本相同的答案。我可能会问,这有什么意义?我所听说的Ackermann函数唯一真正的非理论用途是作为算法运行时的上限。玩具实现是否快速真的很重要吗?我想这里的另一个问题是,为什么你今天问了两次这个问题?一次是java,一次是java对于scheme?在另一个问题上,你得到了基本相同的答案。