二进制搜索必须返回一个值,尽管会返回一个值

时间:2018-12-20 21:01:34

标签: java recursion binary return binary-search

我的任务是使用递归在Java中创建二进制搜索。但是,即使我指定了返回值,它仍然告诉我必须返回一个int结果。这是我的代码的相关部分:

我试图在if-else语句之外添加一个返回值,只是为了接收StackOverflowError。

    result = binarySearch(numbers, 0, numbers.length-1, search);

    if(result==-1)
        System.out.println("Value not found.");
    else
        System.out.println(search + " was found at index " + result);

}

public static int binarySearch(int n[], int f, int l, int val) {        
    if(f>l) 
        return -1;
    else {
        int mid = (f+l)/2;
        if(val == mid)
            return n[mid];

        else {
            if(val < mid)
                binarySearch(n, f, mid-1, val);
            if(val > mid)
                binarySearch(n, f, mid+1, val);
        }

    }
}

我期望如下:从用户收集值 search 并将其传递给binarySearch方法。然后,binarySearch方法应从0的起始值到最终的值搜索我的int数组 numbers ,以找到该值。我相信在binarySearch方法中,我的逻辑是正确的。当初始下限值大于初始上限值时,表示搜索已完成且未找到结果,因此返回-1。否则,该项位于数组中,因此请创建一个值 mid 来设置搜索的中间值。如果要搜索的值等于中值,则返回找到它的索引。如果该值小于中间值,则减小较高的值并再次运行搜索,因为该数字必须在中间值的左侧。如果该值大于中间值,则将其增加并重新运行,因为它必须在右边。我对我的理解正确吗?为什么不能在if-else语句中识别出返回值?

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

逻辑是正确的,您只需要在递归完成后返回,并用if / else替换比较valmid的两个即可。修改后的递归函数将如下所示:

public static int binarySearch(int n[], int f, int l, int val) {
    if(f>l){
        return -1;
    } else {
        int mid = (f+l)/2;
        if(val == mid) {
            return n[mid];
        } else {
            if(val < mid) {
                return binarySearch(n, f, mid-1, val);
            } else {
                return binarySearch(n, mid+1, l, val);
            }
        }
    }
}

答案 1 :(得分:0)

将val与n [mid](而不是mid)进行比较。