我正在使用二进制搜索,我知道如何以非递归方式编写此方法,但我的教授决定使用递归来编写它,这是他的代码:
public static boolean Bsearch(int A[],int low,int high,int key){
if(low>high)
return false;
int mid=(low+high)/2;
if(A[mid]==key)
return true;
if(A[mid]<key)
return Bsearch( A, mid+1, A.length, key);
if(A[mid]>key)
return Bsearch(A, 0, mid-1, key);
return false;
}
我的问题是如何返回false
以及何时会再次停止调用该方法并返回false实际上我不理解它将如何返回false
。我们总是A[mid]
大于或小于或等于我正在搜索的键值。
答案 0 :(得分:2)
这部分将是你的中止条件:
if(low>high)
return false;
最后的- 如果没有找到任何元素 - 将以低于大的低值调用递归 - 并立即中止。
看看这两个电话:
if(A[mid]<key)
return Bsearch( A, mid+1, A.length, key);
if(A[mid]>key)
return Bsearch(A, 0, mid-1, key);
如果mid + 1大于A.length,则调用将返回false。
如果mid-1小于0,则调用将返回false。
如果您将列表缩减为一个元素,则会出现这两种情况 - 然后mid+1
和mid-1
始终与low > high
条件匹配。
最终的“return false”语句永远不会被命中 - 它只需要在那里因为编译器无法知道,其中一个IF语句总是如此。使用if,else if,else可以避免:
if(A[mid]==key)
return true;
else if(A[mid]<key)
return Bsearch( A, mid+1, A.length, key)
else
//this is an implict A[mid]>key
return Bsearch(A, 0, mid-1, key)
//return false; //no longer required.
编辑:Sry,没有注意到:当你进入下一个递归步骤时,你不应该以“0”开头或者直到“A.length” - 而应该保持“低”或者直到“高“ - 另外,你正在上下运行阵列,上下,上下......
修改这样的递归方法调用,那么它应该没问题:
if(A[mid]==key)
return true;
if(A[mid]<key)
return Bsearch( A, mid+1, high, key);
if(A[mid]>key)
return Bsearch(A, low, mid-1, key);
对于indexOutOfBound异常,使用boolean f= Bsearch(A, 0, A.length -1, 9);
调用第一个方法(注意-1)
答案 1 :(得分:1)
你是对的,如果数组中没有密钥,这将永远不会终止。应该有一个基础案例来检查这种情况何时发生?
由于这与学校问题有关,我只是提出一些问题。
什么时候会发生这种情况?如果您一直搜索到可能存在密钥的最后一个可能位置,那么何时会发生?什么参数可以让程序员知道数组中的密钥不存在?
提示:要寻找的关键是高低之间的关系。
public boolean Bsearch(int A[],int low,int high,int key){
//Should have a if statement check here to see if the condition is hit alerting that the array doesn't contain the key
int mid=(low+high)/2;
if(A[mid]==key)
return true;
if(A[mid]<key)
return Bsearch( A, mid+1, A.length, key)
if(A[mid]>key)
return Bsearch(A, 0, mid-1, key)
return false;
}