【问题标题】:Binary search must return a value, though a value is returned二进制搜索必须返回一个值,尽管返回一个值
【发布时间】:2019-05-21 09:45:42
【问题描述】:

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

我尝试在 if-else 语句之外添加一个 return,结果却收到 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 语句中无法识别返回?

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

【问题讨论】:

  • 在递归情况下,您实际上并没有 returning 任何东西。只有跑步。投票结束,因为您的问题是一个错字。
  • @JoeC 抱歉,但您有没有想过,并非每个人都拥有与您相同的理解水平?对你来说似乎很明显的事情对其他人来说可能并不明显。我不是在寻找答案的讲义,我认为很清楚我想要一个适当的解释,以便我能够理解和改进。我花时间通过我的代码写下我的逻辑思维过程,这样如果我错了,我可以得到纠正。
  • 除了缺少return 之外,您还将中间索引与您正在搜索的值而不是中间索引中的值进行比较。

标签: java recursion binary return binary-search


【解决方案1】:

逻辑是正确的,你只需要在递归完成后返回,并将比较val和mid这两个替换为if/else。修改后的递归函数是这样的:

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);
            }
        }
    }
}

【讨论】:

  • 这仍然返回同样的错误,我必须返回 int 类型的东西。
  • 我已经用正确的代码编辑了响应以消除编译错误
  • 我现在从方法的最后一行返回一个 StackOverflowError:return binarySearch(n, f, mid+1, val);。这是递归的错误,不是吗?我真的找不到我的错误。
  • 是的,这是递归逻辑本身的问题。具体来说,在二分查找的第二次调用中,应该是return binarySearch(n, mid+1, l, val);。我已经编辑了代码以反映它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多