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

Java递归二分查找方法匹配成功仍仅返回-1的原因是什么?

问题根因分析

核心问题是递归调用的返回值没有被接收并返回,导致即便深层递归命中了匹配逻辑返回了正确的number值,上层调用栈也不会把这个值向上传递,最终所有非命中的调用栈都会走到方法末尾的return -1,返回给最外层调用方。

你代码里的这两行递归调用产生的结果被直接丢弃了:

binarySearch(middle, last, name);
binarySearch(first, middle, name);

执行完递归逻辑后,方法不会终止,会继续向下执行到最终的return -1,所以无论递归层有没有查到结果,外层拿到的都是-1。

修复方案

只需要在两个递归调用前加上return关键字,把递归结果向上传递即可,同时可以优化边界避免死递归:

private int binarySearch(int first, int last, String name){
    // 增加边界校验,找不到直接返回-1,避免数组越界
    if (first > last) {
        return -1;
    }
    int middle = first + (last - first) / 2;

    if (catalogue[middle].getName().equals(name)){
        return catalogue[middle].getNumber();
    }
    else{
        if(catalogue[middle].getName().compareTo(name) < 0){
            // 新增return返回递归结果,同时调整右边界避免重复判断middle
            return binarySearch(middle + 1, last, name);
        }
        else {
            // 新增return返回递归结果,同时调整左边界避免重复判断middle
            return binarySearch(first, middle - 1, name);
        }
    }
}
额外注意事项
  • 用first + (last - first) / 2计算中间下标,可避免first和last数值过大时出现整数溢出问题
  • 调整递归边界为middle+1和middle-1,可避免目标值不存在时出现死递归的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:24:04