【问题标题】:Wrong value while doing Binary Search using Recursion in java在 java 中使用递归进行二进制搜索时的值错误
【发布时间】:2020-03-09 19:15:33
【问题描述】:

我正在尝试使用递归实现二进制搜索,但我没有得到预期的正确结果。代码如下:

import java.util.*;
class BinarySearchRecursion{

    static private int searchNum(int[] array, int item){
        if(array.length >=2){
            int remainder = array.length%2;
            int splitSize = array.length/2;
            if(remainder==0){
                if(item> array[splitSize-1]){
                    int num = searchNum(Arrays.copyOfRange(array,splitSize,array.length), item);
                    return num;
                }else{
                    int num = searchNum(Arrays.copyOfRange(array,0,splitSize), item);
                    return num;
                }
            }else{
                if(array[splitSize]== item)
                    return splitSize;

                if(item> array[splitSize-1]){
                    int num = searchNum(Arrays.copyOfRange(array,splitSize,array.length), item);
                    return num;
                }else{
                    int num = searchNum(Arrays.copyOfRange(array,0,splitSize), item);
                    return num;
                }
            }
            //System.out.println(splitSize);
        }else{
            if(array[0] == item){
                System.out.println("Item exist");
                return item;
            }
            else
                return -1;
        }
        //return -1;
    }


    public static void main(String... args){
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        int index = searchNum(arr, 89);
        if(index != -1){
            System.out.println("Number exist: "+ Integer.valueOf(index));
        }
        else
            System.out.println("Number does not exist in the given list.");
    }
}

我没有得到正确的项目,比如如果我搜索 8 它会给我价值 2 等等。我在这里做错了什么?

【问题讨论】:

标签: java recursion binary-search


【解决方案1】:

您正在尝试在数组中搜索给定数字的索引,但由于您的递归方法不断将子数组传递给递归调用,因此索引不断变化。

例如,当你打电话时

searchNum(Arrays.copyOfRange(array,splitSize,array.length), item)

当前数组的索引splitSize 将成为传递给searchNum() 的新数组的索引0

您应该始终将原始(完整)数组传递给递归调用,此外,您还应该传递相关范围的第一个和最后一个索引。

您的代码中的另一个错误是在 if(array[0] == item) 条件中,您返回的是项目值而不是该项目的索引。

除此之外,您可能不必为数组的奇数和偶数范围编写单独的逻辑。

【讨论】:

  • 为什么不将奇偶逻辑分开,您将如何管理这两种情况?
猜你喜欢
  • 2022-08-02
  • 2015-01-21
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多