Java 如果没有搜索的值,递归二进制搜索何时终止

Java 如果没有搜索的值,递归二进制搜索何时终止,java,binary-search,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]&l

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

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;
}
publicstaticbooleanbsearch(int A[],int低,int高,int键){
如果(低>高)
返回false;
int mid=(低+高)/2;
如果(A[mid]==键)
返回true;
if(中间键)
返回b搜索(A,0,mid-1,键);
返回false;
}

我的问题是它将如何返回
false
,何时停止调用该方法并返回false实际上我不理解它将如何返回
false
。我们总是有一个[mid]大于或小于或等于我正在搜索的键值

您是对的,如果数组中不存在密钥,则此操作将永远不会终止。应该有一个基本案例来检查何时发生这种情况

由于这与学校的问题有关,我只想提出一些重点问题

什么时候会发生这种情况?如果您一直搜索到密钥可能存在的最后一个可能位置,那么什么时候会发生?哪些参数会让程序员知道数组中不存在密钥

提示:要寻找的关键是高低之间的关系

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;
}
public boolean b搜索(int A[],int低,int高,int键){
//这里应该有一个if语句检查,以查看条件是否命中,从而警告数组不包含键
int mid=(低+高)/2;
如果(A[mid]==键)
返回true;
if(中间键)
返回b搜索(A、0、mid-1、键)
返回false;
}

此部分将成为您的中止条件:

 if(low>high)
      return false;
在最后-如果没有找到元素-将使用low beeing大于high调用递归-并立即中止

看看这两个电话:

if(A[mid]<key)
   return Bsearch( A, mid+1, A.length, key);
if(A[mid]>key)
   return Bsearch(A, 0, mid-1, key);

编辑: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);
if(一个[mid]==键)
返回true;
if(中间键)
返回b搜索(A、低、中1、键);

对于indexOutOfBound异常,使用
boolean f=Bsearch(A,0,A.length-1,9)调用第一个方法(注意-1)

好的,我假设您现在已经完成了代码更改。如果要查找的密钥恰好不在数组中,则需要考虑在这种算法中会发生什么。然后设置某种类型的
if
语句来测试该条件。您的意思是要在第六行将
high
更改为
A.length
?确实,在某些情况下,该代码将永远递归-例如,如果
key
小于最小的元素。那么,您的任务是找出原因并修复代码,还是什么?问题是代码没有进行正确的二进制搜索。间隔时间只适用于某些极端情况,并且缺少终端条件。无论如何,在这个问题的版本中有两个相当基本的错误,它们不在您发布的第一个版本中,并且当前在这里的两个答案都没有解决。你让我们很难帮助你,当我们每次看到的问题都略有不同时。在任何情况下,可能对您来说最好的做法是使用调试器逐步完成代码-在这种情况下,您将能够准确地看到发生了什么;布尔f=b搜索(A,0,A.长度,4);系统输出打印ln(f);当我运行这个:public static void main(String[]args){//TODO自动生成的方法stub int[]A={1,2,3,6,8};boolean f=Bsearch(A,0,A.length,9);System.out.println(f);}时,它在线程“main”中给出了异常java.lang.ArrayIndexOutOfBoundsException:如果答案无效,您不应该接受它。如果(低>高)返回false,我实际上添加了这个部分;但是如果没有找到搜索到的元素,它仍然会给出一个错误。你能帮我吗?当我运行以下代码时:publicstaticvoidmain(String[]args){//TODO自动生成的方法stubint[]A={1,2,3,6,8};booleanf=Bsearch(A,0,A.length,4);System.out.println(f);}它在线程“main”中给了我异常当我运行以下命令时,java.lang.StackOverflowErrorAlso:public static void main(String[]args){//TODO自动生成的方法stub int[]A={1,2,3,6,8};boolean f=Bsearch(A,0,A.length,9);System.out.println(f);}它给出了线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常
 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);