【问题标题】:Having trouble picking out logic error无法找出逻辑错误
【发布时间】:2015-05-01 17:24:29
【问题描述】:

我只是在用一个 int 数组练习我的二进制搜索,并不能完全弄清楚为什么我的逻辑不正确。我已经追踪了我的代码,这一切都在我身上。然而,代码编译得很好;我缺少一些逻辑。我可以有一组额外的眼睛追踪我的小部分吗?

我认为我不需要返回 0;但是如果没有其他外部的返回,我就无法编译我的代码。

public static void main (String[] args)
    {
        int[] data = new int[]{5,10,15,20,25,30,35,40,45,50,55,60};
        int first = 0;
        int last = data.length;
        int target = 55;
        System.out.print(BinarySearch(data,first,last,target));
    }
    public static int BinarySearch(int[] data, int first, int last,int target)
    {
        if(first > last)
            return -1;
        else{
            int middle = (first+last)/2;
            if(target == data[middle])
                return data[middle];
            else if(target < data[middle])
                BinarySearch(data,first,middle-1,target);
            else
                BinarySearch(data,middle+1,last,target);
        }
      return 0;
    }

【问题讨论】:

    标签: java recursion logic


    【解决方案1】:

    您忽略了递归调用的结果。

    返回递归调用的结果。

    return BinarySearch(data,first,middle-1,target);
    

    return BinarySearch(data,middle+1,last,target);
    

    然后你可以去掉最后的return 0;;现在是无法访问的代码。

    此外,如果您的 BinarySearch 方法返回找到 target 的位置的索引,则它会更有用,例如return middle; 而不是 return data[middle]

    为避免在搜索太高的target 时出现ArrayIndexOutOfBoundsException,请将data.length - 1 分配给last,而不是data.length。初始的firstlast 必须是最小可能索引和最大可能索引。

    【讨论】:

    • 所以返回索引而不是返回值更好?
    • 是的。返回值只是告诉您它存在于数组中。如果-1 是您正在寻找的东西,那么它什么也不会告诉您。二进制搜索的目的是找到目标的位置,而不仅仅是它是否存在。
    • 一个更快速的问题。我将如何检查(目标不在数组中)
    • 你已经在检查了;如果它不在数组中,则返回 -1(无效的数组索引)。
    • 这就是我的想法,但它不断给我数组索引越界错误。
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多