Почему возврат выполняется дважды - PullRequest
0 голосов
/ 01 сентября 2018

В этом случае значение действительно совпадает, и значение 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 голосов
/ 01 сентября 2018

Вы также можете попробовать следующий код в функции 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;
}
0 голосов
/ 01 сентября 2018
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;
    }
}
0 голосов
/ 01 сентября 2018

Поскольку ваш return 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;
}
0 голосов
/ 01 сентября 2018

Вы пропускаете два возврата при вызове рекурсии:

return binSearch(...);

Если вы не напишите их, метод проигнорирует результат рекурсии и просто вернет false в конце. После этого последний return будет ненужным и должен быть удален. Наконец, вам нужно проверить случай, когда low > high, это означает, что элемент не был найден.

...