簡體   English   中英

為什么會出現Stackoverflow錯誤?

[英]Why do I get a Stackoverflow Error?

我有一個遞歸算法,應該猜一個數字。 我調用方法guessNumber,並給出一個數字和一個比該數字低的值,以及一個比數字高的值。 如果該值高於數字區域的中間值,則對新的數字區域進行相同的處理。 但是它的值越小,數字面積越小。 如果所有這些情況都不成立,則返回最大值(可能是最小值,因為此時它們是相同的)。 但是為什么要給出一個StackOverflowError? 我不明白為什么程序無法結束。 任何幫助將不勝感激。 謝謝。

public class Starter {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    Starter s = new Starter();
    System.out.println(s.guessNumber(18, 1, 100));
}

public int guessNumber(int num, int min, int max) {
    int middle = (max - (min - 1)) / 2;
    if (num > middle) {
        guessNumber(num, middle + 1, max);
    } else if (num < middle) {
        guessNumber(num, min, middle);
    }
    return max;
}
}

現在,此代碼不再出現錯誤:

public int guessNumber(int num, int min, int max) {
int middle = (max + min) / 2;
if (num > middle) {
    return guessNumber(num, middle + 1, max);
} else if (num < middle) {
    return guessNumber(num, min, middle);
}
return max;
}

但是這個數字不正確。 如果我用這種方式來guessNumber(18, 1, 100)guessNumber(18, 1, 100)的預期輸出應該是18但我得到19 如果我這樣稱呼guessNumber(34, 1, 100)則輸出為37

首先,您忘記了返回遞歸調用的值。

其次,您對middle位數的計算是錯誤的。 例如,如果min為10且max為20,則您的計算會將5分配給middle ,而不是15。

public int guessNumber(int num, int min, int max) {
    if (min == max) {
        return min;
    }
    int middle = (max + min) / 2;
    if (num > middle) {
        return guessNumber(num, middle + 1, max);
    } else {
        return guessNumber(num, min, middle);
    }
}

暫無
暫無

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

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