如果所寻求的值不存在,则递归二进制搜索何时终止

时间:2015-01-25 18:30:28

标签: java binary-search

我正在使用二进制搜索,我知道如何以非递归方式编写此方法,但我的教授决定使用递归来编写它,这是他的代码:

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]大于或小于或等于我正在搜索的键值。

2 个答案:

答案 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+1mid-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;
}