簡體   English   中英

使用遞歸算法進行二分搜索

[英]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)) / 2lt/2相同,因為 st + (lt - st) = st - st + lt (通過為它們分配您想要的任何值來進行測試)。 因此,即使您更改了 st 在binAry(ary, mid+1, lt, val)中的值,它確實沒有任何效果。 它永遠是numbers.length - 1mid永遠是 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.

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