You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java二分查找代码返回-1而非预期值4的问题排查求助

修复二分查找返回-1的问题

嘿,我来帮你搞定这个二分查找的问题!你的代码之所以返回-1找不到目标元素9,其实是几个小细节没处理好,我给你拆解一下问题,再附上修复后的完整代码:

问题分析

  • 递归结果未返回:原代码中递归调用returnIndex后没有写return,导致递归得到的正确索引无法传递到上层调用,最终还是返回初始的-1。
  • 右半区间起始位置错误:当目标值大于arr[mid]时,应该把start设为mid + 1(因为mid位置已经确认不是目标值),而不是直接赋值为mid,否则会重复检查同一位置,甚至可能陷入死循环。
  • 左半区间逻辑缺失:原代码的else分支只写了一半,没有处理目标值小于arr[mid]时的递归逻辑。
  • 缺少递归终止条件:当start > end时,说明数组中已经没有可查找的区间了,目标值不存在,应该直接返回-1,避免无效递归或数组越界。

修复后的完整代码

package com.ibm.prac;

public class Main {
    public static void main(String[] args) {
        int[] arr = {1,2,5,7,9,10};
        int no = 9;
        int index = returnIndex(arr, no, 0, arr.length - 1);
        System.out.println(index); // 现在会输出正确的索引4
    }

    private static int returnIndex(int[] arr, int no, int start, int end) {
        // 终止条件:没有可查找的区间了,返回-1
        if (start > end) {
            return -1;
        }
        // 计算中间索引,避免溢出的写法可以用 start + (end - start) / 2
        int mid = (start + end) / 2;
        if (no == arr[mid]) {
            // 找到目标值,返回索引
            return mid;
        } else if (no > arr[mid]) {
            // 目标值在右半区间,递归查找右半部分
            return returnIndex(arr, no, mid + 1, end);
        } else {
            // 目标值在左半区间,递归查找左半部分
            return returnIndex(arr, no, start, mid - 1);
        }
    }
}

额外优化说明

我还调整了方法的参数,把mid从参数里去掉了,因为每次递归都应该重新计算中间索引,这样代码更简洁也更符合二分查找的逻辑。另外,类名改成了Main(Java规范中类名首字母大写)。

内容的提问来源于stack exchange,提问作者Budding_Talent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:19:04