[英]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.