为什么两次执行退货

时间:2018-09-01 19:38:48

标签: java recursion binary-search

在这种情况下,该值确实匹配并且boolean的值设置为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;
    }
}

4 个答案:

答案 0 :(得分:8)

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

var categories = xDoc.Root.Element("Categories");
foreach (var category in wiki.Categories)
{
    category.SerializeToXElement(categories);
}

如果不编写它们,该方法将忽略递归的结果,并仅在最后返回return binSearch(...); 。之后,最后一个false将是不必要的,应删除。最后,您需要检查return时的情况,这意味着找不到该元素。

答案 1 :(得分:2)

因为您的child会覆盖所有内容,除了在首次运行时找到该值并且不调用递归调用的情况。请为每个递归调用返回。此外,您必须检查您的下限是否小于或等于上限。因此,您的代码可能如下:

return false;

答案 2 :(得分:0)

您也可以在binSearch函数中尝试以下代码。唯一的变化是,存在一个布尔类型变量,该变量捕获递归调用中返回的值并最终返回此变量。

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;
}

答案 3 :(得分:-1)

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;
    }
}