Java 识别逻辑错误有困难

Java 识别逻辑错误有困难,java,recursion,logic,Java,Recursion,Logic,我只是在练习用int数组进行二进制搜索,不太明白为什么我的逻辑不正确。我已经追踪了我的代码,所有这些都是我的。但是代码编译得很好;我缺少一些逻辑。我可以用一双额外的眼睛来追踪我的小片段吗 我不认为我需要返回0;但是我不能让我的代码编译而不在我的else之外返回 public static void main (String[] args) { int[] data = new int[]{5,10,15,20,25,30,35,40,45,50,55,60};

我只是在练习用int数组进行二进制搜索,不太明白为什么我的逻辑不正确。我已经追踪了我的代码,所有这些都是我的。但是代码编译得很好;我缺少一些逻辑。我可以用一双额外的眼睛来追踪我的小片段吗

我不认为我需要返回0;但是我不能让我的代码编译而不在我的else之外返回

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;
    }
publicstaticvoidmain(字符串[]args)
{
int[]数据=新的int[]{5,10,15,20,25,30,35,40,45,50,55,60};
int first=0;
int last=data.length;
int目标=55;
System.out.print(二进制搜索(数据、第一个、最后一个、目标));
}
公共静态int-BinarySearch(int[]数据,int-first,int-last,int-target)
{
如果(第一个>最后一个)
返回-1;
否则{
中间整数=(第一个+最后一个)/2;
如果(目标==数据[中间])
返回数据[中间];
else if(目标<数据[中间])
二进制搜索(数据,第一,中间-1,目标);
其他的
二进制搜索(数据,中间+1,最后一个,目标);
}
返回0;
}

您正在忽略递归调用的结果

return BinarySearch(data,first,middle-1,target);
返回递归调用的结果

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

然后可以删除
返回0在末尾;它现在是不可访问的代码

此外,如果您的
BinarySearch
方法返回其找到
target
的位置的索引,则该方法将更加有用,例如
return middle
而不是
返回数据[中间]


为避免搜索过高的
目标时出现
数组索引超出边界异常
,请将
data.length-1
指定给
last
,而不是
data.length
。初始的
first
last
必须是最小可能索引和最大可能索引。

因此最好返回索引而不是值?是的。返回值只是告诉您它存在于数组中。如果你要找的是
-1
,那么它什么也不告诉你。二进制搜索的目的是找到目标所在的位置,而不仅仅是目标是否存在。还有一个简单的问题。如何检查(目标不在数组中)您是否已经在检查;如果它不在数组中,则返回
-1
(一个无效的数组索引)。这是我的想法,但它一直给我数组索引越界错误。