Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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_Recursion_Binary Search - Fatal编程技术网

Java 为什么要执行两次返回

Java 为什么要执行两次返回,java,recursion,binary-search,Java,Recursion,Binary Search,在这种情况下,值确实匹配,布尔值设置为true,但是调用了两次return并将值更新为false。有人能告诉我这里缺少什么吗 public class BinSearch { public static void main(String[] args) { BinSearch bin=new BinSearch(); int arr[]= {2,4,6,8,10,12,14,16}; boolean b=bin.binSearch(ar

在这种情况下,值确实匹配,布尔值设置为true,但是调用了两次return并将值更新为false。有人能告诉我这里缺少什么吗

public class BinSearch {

    public static void main(String[] args) {

        BinSearch bin=new BinSearch();
        int arr[]= {2,4,6,8,10,12,14,16};
        boolean b=bin.binSearch(arr,0,arr.length-1,12);
        System.out.println("Number found "+b);

    }

    public  boolean binSearch(int arr[],int low,int high,int val)
    {
        int mid=(low+high)/2;

        if(arr[mid]==val)
        {
            return true;
        }

        else if(arr[mid]>val)
        {
            binSearch(arr,mid+1,high,val);
        }

        else  
        {
            binSearch(arr,low+1,mid,val);
        }

        return false;
    }
}

调用递归时缺少两个返回:

return binSearch(...);
如果不编写它们,该方法将忽略递归的结果,并在最后返回
false
。执行此操作后,最后一个
返回值将不必要,应该删除。最后,您需要在
low>high
时检查大小写,这意味着找不到元素。

公共类bin搜索{
public class BinSearch {

    public static void main(String[] args) {

        BinSearch bin=new BinSearch();
        int arr[]= {2,4,6,8,10,12,14,16};
        boolean b=bin.binSearch(arr,0,arr.length-1,16);
        System.out.println("Number found "+b);

    }

    public  boolean binSearch(int arr[],int low,int high,int val)
    {
        int mid=(low+high)/2;
        //boolean b = false;
        while(low<=high)
        {
            if(arr[mid]==val)
            {
                return true;
            }

            else if(val>arr[mid])
            {
                return binSearch(arr,mid+1,high,val);
            }

            else  
            {
                return binSearch(arr,low+1,mid,val);
            }

        }

        return false;
    }
}
公共静态void main(字符串[]args){ BinSearch bin=新的BinSearch(); int arr[]={2,4,6,8,10,12,14,16}; 布尔b=二进制二进制搜索(arr,0,arr.length-1,16); 系统输出打印项次(“找到的编号”+b); } 公共布尔binSearch(int-arr[],int-low,int-high,int-val) { int mid=(低+高)/2; //布尔b=假; while(低arr[mid]) { 返回b搜索(arr、mid+1、high、val); } 其他的 { 返回b搜索(arr、低+1、中、val); } } 返回false; } }
因为您的
返回false覆盖所有内容,但在第一次运行时发现该值且未调用递归调用的情况除外。请返回每个递归调用。此外,必须检查低边界是否小于或等于高边界。因此,您的代码可以如下所示:

public boolean binSearch(int arr[],int low,int high,int val)
{
    if (low <= high) {
       int mid=(low+high)/2;
       if(arr[mid]==val) {
          return true;
       } else if(arr[mid]>val) {
          return binSearch(arr,mid+1,high,val);
       } else {
          return binSearch(arr,low+1,mid,val);
       }
    }
    return false;
}
public boolean-bin搜索(int-arr[],int-low,int-high,int-val)
{
如果(低值){
返回b搜索(arr、mid+1、high、val);
}否则{
返回b搜索(arr、低+1、中、val);
}
}
返回false;
}

您也可以在
b搜索功能中尝试以下代码。唯一的改变是有一个布尔型变量,它捕获递归调用中返回的值,并最终返回这个变量

public  boolean binSearch(int arr[],int low,int high,int val) {
    int mid=(low+high)/2;
    boolean returnValue = false;

    if(arr[mid]==val) {
        return true;
    } else if(arr[mid]>val) {
        returnValue  = binSearch(arr,mid+1,high,val);
    } else {
        returnValue  = binSearch(arr,low+1,mid,val);
    }    
    return returnValue;
}