[英]Using recursive algorithm for binary search
幫我。 我是 java 的新手,我陷入了二進制搜索遞歸(stackoverflow 錯誤),在任何地方都找不到解決方案。
public class BinarySearch {
public static int binAry (int ary[], int st, int lt, int val){
if (st<=lt) {
int mid = (st + (lt-st)) / 2;
if (val > ary[mid]) {
binAry(ary, mid+1, lt, val);
}
else if (val < ary[mid]) {
binAry(ary, st, mid-1, val);
}
else{
return mid;
}
}
return -1;
}
public static void main (String[] args){
BinarySearch bs = new BinarySearch();
int [] numbers = {0,1,2,3,4,5};
int x = 3;
int pt = numbers.length;
int p = bs.binAry(numbers, 0, pt-1, x);
if (p == -1){
System.out.println("Number not found.");
}
else{
System.out.println("Number found at " + p);
}
}
}
就我所見,問題在於(val > ary[mid])將始終評估為真。 總是。 因此,您的代碼將進入無限循環,最終導致 StackOverFlow 異常。
如果您跟蹤代碼中涉及的變量的值,您會注意到val從未改變,從一開始就是它的值 3。
此外, int mid = (st + (lt-st)) / 2與lt/2相同,因為 st + (lt - st) = st - st + lt (通過為它們分配您想要的任何值來進行測試)。 因此,即使您更改了 st 在binAry(ary, mid+1, lt, val)中的值,它確實沒有任何效果。 它永遠是numbers.length - 1 , mid永遠是 5/ 2 =2。
在int mid = (st + (lt-st)) / 2正下方添加此代碼以自行檢查:
System.out.println("st="+st);
System.out.println("lt="+lt);
System.out.println("mid="+mid);
也許如果你解釋了你想做什么,我會更好地理解這一點,也許我能夠真正幫助找到解決方案。
編輯:好的,在花費更多時間之后,我發現了您的錯誤。 更改公式:
int mid = (st + (lt-st)) / 2 // This is wrong
int mid = st + (lt-st) / 2; // This is ok, notice the parentheses
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.