Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中使用递归的二进制搜索_Java - Fatal编程技术网

Java中使用递归的二进制搜索

Java中使用递归的二进制搜索,java,Java,我正在学习递归,所以试图通过实现二进制搜索算法来实践它 public class BinarySearch { public int search(int[] items, int searchTerm, int startIndex, int endIndex) { int midIndex = (startIndex + endIndex)/2 ; System.out.println("Midpoint: "+midIndex); i

我正在学习递归,所以试图通过实现二进制搜索算法来实践它

public class BinarySearch {
    public int search(int[] items, int searchTerm, int startIndex, int endIndex) {
        int midIndex = (startIndex + endIndex)/2 ;
        System.out.println("Midpoint: "+midIndex);
        if(searchTerm == items[midIndex]) {
            return midIndex;
        } else if(searchTerm > items[midIndex]) {
            search(items, searchTerm, midIndex, endIndex);
        } else if(searchTerm < items[midIndex]) {
            search(items, searchTerm, startIndex, midIndex);
        } else {
            return -1;
        }
        return -1;
    }

    public static void main(String[] args) {
        BinarySearch bs = new BinarySearch();
        int[] items = { 1, 7, 9, 11, 22, 55, 67 };
        int index = bs.search(items, 7, 0, items.length-1);
        System.out.println(index);
    }

}
执行下面的代码,而不是退出该方法

else if(searchTerm < items[midIndex]) {
            search(items, searchTerm, startIndex, midIndex);
        }
else if(searchTerm

然后返回-1。我觉得这可能与递归有关,因为前面调用的
search()
仍将在堆栈中,这是由于代码的递归性质,它可能会从堆栈中弹出。然而,我不能真正理解它。使用递归实现
BinarySearch
的正确方法是什么?

您没有返回递归调用

    public int search(int[] items, int searchTerm, int startIndex, int endIndex) {
        int midIndex = (startIndex + endIndex)/2 ;
        System.out.println("Midpoint: "+midIndex);
        if(searchTerm == items[midIndex]) {
            return midIndex;
        } else if(searchTerm > items[midIndex]) {
            return search(items, searchTerm, midIndex, endIndex);
        } else if(searchTerm < items[midIndex]) {
            return search(items, searchTerm, startIndex, midIndex);
        } else {
            return -1;
        }
        return -1;
    }
public int search(int[]项,int searchTerm,int startIndex,int endIndex){
int midIndex=(开始索引+结束索引)/2;
System.out.println(“中点:+midIndex”);
if(searchTerm==items[midIndex]){
返回midIndex;
}else if(searchTerm>items[midIndex]){
返回搜索(项目、搜索词、midIndex、endIndex);
}else if(searchTerm
更新

正如您所知,递归使用方法堆栈。因此,当您在找到元素时没有返回值时,您的最终递归调用将始终返回-1,因为它是方法中的最后一行


这就是为什么您得到了-1。

您没有返回递归调用

    public int search(int[] items, int searchTerm, int startIndex, int endIndex) {
        int midIndex = (startIndex + endIndex)/2 ;
        System.out.println("Midpoint: "+midIndex);
        if(searchTerm == items[midIndex]) {
            return midIndex;
        } else if(searchTerm > items[midIndex]) {
            return search(items, searchTerm, midIndex, endIndex);
        } else if(searchTerm < items[midIndex]) {
            return search(items, searchTerm, startIndex, midIndex);
        } else {
            return -1;
        }
        return -1;
    }
public int search(int[] items, int searchTerm, int startIndex, int endIndex)
{
  int midIndex = (startIndex + endIndex) / 2; 
  if (startIndex > endIndex)
    return -1;
  else if (searchTerm == items[midIndex]) 
    return midIndex;
  else if (searchTerm < items[midIndex]) 
    return search(items, searchTerm, startIndex, midIndex - 1);
  else // (searchTerm > items[midIndex]) 
    return search(items, searchTerm, midIndex + 1, endIndex);
}
public int search(int[]项,int searchTerm,int startIndex,int endIndex){
int midIndex=(开始索引+结束索引)/2;
System.out.println(“中点:+midIndex”);
if(searchTerm==items[midIndex]){
返回midIndex;
}else if(searchTerm>items[midIndex]){
返回搜索(项目、搜索词、midIndex、endIndex);
}else if(searchTerm
更新

正如您所知,递归使用方法堆栈。因此,当您在找到元素时没有返回值时,您的最终递归调用将始终返回-1,因为它是方法中的最后一行

这就是为什么您得到了-1。

public int search(int[]项,int searchTerm,int startIndex,int endIndex)
public int search(int[] items, int searchTerm, int startIndex, int endIndex)
{
  int midIndex = (startIndex + endIndex) / 2; 
  if (startIndex > endIndex)
    return -1;
  else if (searchTerm == items[midIndex]) 
    return midIndex;
  else if (searchTerm < items[midIndex]) 
    return search(items, searchTerm, startIndex, midIndex - 1);
  else // (searchTerm > items[midIndex]) 
    return search(items, searchTerm, midIndex + 1, endIndex);
}
{ int midIndex=(开始索引+结束索引)/2; 如果(开始索引>结束索引) 返回-1; else if(searchTerm==items[midIndex]) 返回midIndex; else if(searchTermitems[midIndex]) 返回搜索(items、searchTerm、midIndex+1、endIndex); }
在这个版本的二进制搜索中,我使用了
midIndex±1
:我这样做是因为在if语句中,您已经检查
items[midIndex]
是否等于
searchTerm
,这就是为什么在接下来的调用中不必考虑
items[midIndex]

public int search(int[]项目,整数搜索项,整数开始索引,整数结束索引)
{
int midIndex=(开始索引+结束索引)/2;
如果(开始索引>结束索引)
返回-1;
else if(searchTerm==items[midIndex])
返回midIndex;
else if(searchTermitems[midIndex])
返回搜索(items、searchTerm、midIndex+1、endIndex);
}

在这个版本的二进制搜索中,我使用了
midIndex±1
:我这样做是因为在if语句中,您已经检查
items[midIndex]
是否等于
searchTerm
,这就是为什么要考虑
items[midIndex]
在接下来的调用中是不必要的。

您没有返回递归调用的结果:
返回搜索(items、searchTerm、startIndex、midIndex)
您没有返回递归调用的结果:
返回搜索(items、searchTerm、startIndex、midIndex)谢谢,这确实解决了问题。你能解释一下返回递归调用意味着什么吗?该方法不应该被添加到执行堆栈吗?@swati该方法被调用,但其结果被丢弃。然后,调用末尾的
返回-1
。如果注释掉最后的
return-1,您可以在Eclipse中更清楚地看到这一点语句:您应该会得到一个错误。此代码没有编译,因为现在已包含缺少的
return
语句,最后的
return-1是无法访问的代码。实际上,即使是
else{return-1;}
子句也是死代码,因为当比较两个
int
值时,结果必须是“等于”、“更大”或“更小”之一,但编译器不会检查它。谢谢,这确实解决了问题。你能解释一下返回递归调用意味着什么吗?该方法不应该被添加到执行堆栈吗?@swati该方法被调用,但其结果被丢弃。然后,调用末尾的
返回-1
。如果注释掉最后的
return-1,您可以在Eclipse中更清楚地看到这一点语句:您应该会得到一个错误。此代码没有编译,因为现在已包含缺少的
return
语句,最后的
return-1是无法访问的代码。实际上,即使是
else{return-1;}
子句也是死代码,因为在比较两个
int
值时,结果必须是“等于”、“更大”或“更小”中的一个,但编译器不会对此进行检查,当值为no时,此代码可能会以无限递归结束