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
相关产品推荐
相关产品推荐

