使用递归算法进行二进制搜索

时间:2020-05-20 06:28:31

标签: java algorithm recursion search 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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

对于我所看到的,问题是(val> ary [mid])总是评估为true。总是。因此,您的代码将进入一个无限循环,最终将导致StackOverFlow异常。

如果您遵循代码中涉及的变量的值,您会注意到 val 永远不会改变,因为它从一开始就是它的值3。

另外, int mid =(st +(lt-st))/ 2 lt / 2 相同,因为st +(lt-st)= st-st + lt(通过为它们分配所需的任何值来进行测试)。因此,即使您在 binAry(ary,mid + 1,lt,val)中更改st的值,它实际上也没有任何作用。 lt 始终为 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