簡體   English   中英

java.lang.StackOverflowError? 在java中

[英]java.lang.StackOverflowError? in java

我在運行代碼時收到此“ java.lang.StackOverflowError”,但當我輸入大數字(7,10)時問題就來了

這是我寫的代碼

計算阿克曼函數的代碼

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,但是問題無法解決,,,,,

您創建了“無盡”或至少“太深”的遞歸。 這就是這里的問題。

更不用說這個功能眾所周知非常非常快地增長的事實。 因此,您將需要BigInteger(不是int,不會很長)。 即使BigInteger也不會讓您走得太遠。

  • 堆棧溢出意味着太多的嵌套方法調用

  • 您的邏輯似乎正確,這肯定是由於涉及到許多遞歸調用。

  • 無論如何,我認為您應該很高興看到ACK(4,4)的結果

  • ACK(7,10) -真的嗎? 問得太多...就像打電話給NQueens(16) :P

您可以嘗試操縱JVM堆棧大小。 我不確定這是否最終會有所幫助,但是如果您有一台具有大量內存的計算機,則可以增加堆棧和堆,並將故障進一步排除。

默認堆棧大小為384KB。 您可以使用JVM的-Xss參數對其進行操作。 例如, -Xss512k將堆棧大小設置為512KB。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM