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时,此代码可能会以无限递归结束