java.lang.StackOverflower错误?在爪哇

java.lang.StackOverflower错误?在爪哇,java,Java,我得到这个“java.lang.StackOverflower错误” 当我运行代码时 但是当我输入一个像(7,10)这样的大数字时,问题就来了 这是我写的代码 用于计算Ackermann函数的代码 public static void main(String[] args) { int m, n, s; Scanner maher = new Scanner(System.in); System.out.println(" the code for calculate T

我得到这个“java.lang.StackOverflower错误” 当我运行代码时 但是当我输入一个像(7,10)这样的大数字时,问题就来了

这是我写的代码

用于计算Ackermann函数的代码

public static void main(String[] args) {
    int m, n, s;
    Scanner maher = new Scanner(System.in);
    System.out.println(" the code for calculate The Ackermann Function ");
    System.out.println(" Enter first number M");
    m = maher.nextInt();
    System.out.println(" Enter Second number N");
    n = maher.nextInt();
    System.out.println("A(" + m + " , " + n + ") = " + Ack(m, n) + " \n");
}
public static int Ack(int m, int n) {
    if (m == 0) {
        return n + 1;
    }
    if (m != 0 && n == 0) {
        return Ack(m - 1, 1);
    }
    if (m != 0 && n != 0) {
        return Ack(m - 1, Ack(m, n - 1));
    }
    return 0;
    // This code written by Maher Al Shammari 212542270 // KFU
}
我尝试将类型更改为long,但问题没有解决,,,,

您创建了“无止境”或至少“太深”的递归。 这就是问题所在

更不用说这个函数增长非常快这一事实了。
因此,您需要biginger(不是int,不是long)。可能即使是BigInteger也不会让您走得太远。

您可以尝试操纵JVM堆栈大小。我不确定这最终是否会有帮助,但是如果你有一台拥有大量内存的机器,你可以增加堆栈和堆,进一步排除故障

默认堆栈大小为384KB。您可以使用
-Xss
参数对JVM进行操作。例如,
-Xss512k
将堆栈大小设置为512KB。

  • 堆栈溢出表示嵌套方法调用过多

  • 您的逻辑似乎是正确的,这肯定是由于涉及了许多递归调用

  • 无论如何,我认为您应该很高兴看到ACK(4,4)的结果

  • 确认(7,10)-真的吗?要求太多。。。这就像叫恩奎恩斯(16):P


您确实意识到,任何计算机都不可能有足够的空间来存储这么多的级别,对吗?说阿克曼(7,10)是巨大的是一个巨大的轻描淡写。这就是阿克曼函数的要点。正在创建大量的递归。@Maher是的,请检查终止条件。可能你错过了什么。我很确定BigInteger不会有帮助;我怀疑Ackermann(6,6)是否适合大整数,更不用说Ackermann(7,10)。实际上,只要快速查找一下,我认为阿克曼(4,4)也不适合大整数。@Maher我的直觉是你不能。Ackermann的不是原始的递归,我怀疑你能很容易地把它转换成迭代形式。记忆中间结果将有助于它执行得更快,但对递归深度却无能为力。@millimoose也许?我认为对于99.9999%听说过这个函数的人来说,“太多”是关于Ackermann(4,4)@Maher的所有你需要知道的。你可以通过创建一个备用宇宙来存储数字来解决它。一般来说,这不是一个坏主意,但对于这一点,问题是OP试图计算的数字太大;计算机无法存储那么多的数字周期,更不用说为所有递归级别留出空间(也无法使其迭代)@DennisMeng这将是一个问题。最终,他将溢出任意精度数据容器之外的任何内容。从维基百科条目来看:它的价值增长迅速,即使是很小的投入。例如A(4,2)是一个19729位小数的整数;(4,4)有2^(2^(65536))个数字。它太大了,指数不能放在任何地方。(编辑:好吧,它有那么多位。如果你想要数字,除以4个lowballs,那仍然是,你知道,大到足以让点通过)最后一点不完全正确;恩奎恩斯(16岁)的挑战性要小得多。他认为@Mitesh,,,,,,,,,,丹尼斯蒙同意。。我想应该是TowerOfHanoi(16个磁盘):再干一次,还是小菜一碟。Ack(4,4)不适合,即使你拿走了世界上所有的电脑。TowerOfHanoi(16)适合我的手机。新的一天,我希望我的信息被传达;)