при кодировании бинарного поиска с использованием рекурсии я столкнулся с некоторыми сомнениями - PullRequest
2 голосов
/ 06 августа 2020

При использовании только if мне пришлось вернуть некоторое целое число

public class solution {
    
    public static int binarySearch(int arr[], int x,int si,int ei){
        if(si>ei){
            return -1;
        }
        int mid=(si+ei)/2;
        if(arr[mid]==x){
            return mid;
        }
        if(arr[mid]>x){
           return binarySearch(arr,x,si,mid-1);
        }
        if(arr[mid]<x){
           return binarySearch(arr,x,mid+1,ei);
        }
        return 0;
    }

   
}

, но при использовании if-else-if мне не нужно вернуть любое целое число, почему?

public class solution {
    
    public static int binarySearch(int arr[], int x,int si,int ei){
        if(si>ei){
            return -1;
        }
       
        int mid=(si+ei)/2;
        if(arr[mid]==x){
            return mid;
        }
        else if(arr[mid]>x){
           return binarySearch(arr,x,si,mid-1);
        }
        else {
           return binarySearch(arr,x,mid+1,ei);
        }
    }
}

Ответы [ 4 ]

3 голосов
/ 06 августа 2020

Компилятор не может угадать, что последнее условие if всегда будет истинным. Поэтому вы должны предоставить возвращаемое значение, если оно ложно. Хотя этого никогда не будет. Вы даже можете избавиться от последнего оператора if.

    public class solution {
    
    public static int binarySearch(int arr[], int x,int si,int ei){
        if(si>ei){
            return -1;
        }
        int mid=(si+ei)/2;
        if(arr[mid]==x){
            return mid;
        }
        if(arr[mid]>x){
           return binarySearch(arr,x,si,mid-1);
        }
        return binarySearch(arr,x,mid+1,ei);
    }

   
}
3 голосов
/ 06 августа 2020

Когда метод имеет тип возвращаемого значения в сигнатуре, что-то должно быть возвращено из метода во всех условиях. И эта проверка выполняется во время компиляции в Java.

Когда вы логически используете if в своем коде, это условие может быть истинным или ложным. Если это правда, метод получит что-то, что возвращается из блока if. Но если условие ложно, метод не получит ничего, чтобы вернуть обратно (потому что код внутри условия if не выполняется). Таким образом, в этом случае методу нужно что-то возвращать по умолчанию, если условие имеет значение false. Из первого метода, если все условия типа

        if(si>ei){
            return -1;
        }
        int mid=(si+ei)/2;
        if(arr[mid]==x){
            return mid;
        }
        if(arr[mid]>x){
           return binarySearch(arr,x,si,mid-1);
        }
        if(arr[mid]<x){
           return binarySearch(arr,x,mid+1,ei);
        }

ложны. Метод не сможет ничего вернуть.

В другом месте, когда вы используете else с if (погода это if-else или if-elseIf-else), тогда условие, когда если false (или else if false), часть else вернет что-то из метода. Так что всегда будет что вернуть из метода. Во втором методе, например

if(arr[mid]==x){
        return mid;
    }
   else if(arr[mid]>x){
       return binarySearch(arr,x,si,mid-1);
    }
   else
       return binarySearch(arr,x,mid+1,ei);
   }

, если первое условие истинно, будет возвращено mid. Если arr[mid]>x истинно, возвращается binarySearch(arr,x,si,mid-1); результат. Если оба верны, то всегда будет что-то вернуть (в вашем случае binarySearch(arr,x,mid+1,ei);).

1 голос
/ 06 августа 2020

Потому что все возможные результаты работы вашего второго метода что-то вернут. Вам всегда нужно убедиться, что, когда ваш метод не void.

В первом случае вам нужно указать возвращаемое значение для случая, когда ни одно из ваших трех условий операторов if не равно true.

    if(arr[mid]==x){
        return mid;
    }
    if(arr[mid]>x){
       return binarySearch(arr,x,si,mid-1);
    }
    if(arr[mid]<x){
       return binarySearch(arr,x,mid+1,ei);
    } 

Однако ясно, что вы никогда не столкнетесь с ситуацией, когда все вышеперечисленные условия равны false, но компилятор не может это понять, поэтому вам нужно разработать свой код таким образом , в котором компилятор будет знать, что во всех возможных условиях ваш метод вернет значение. Так что вторая реализация более «чистая» и логически правильная

0 голосов
/ 06 августа 2020

вы установили возвращаемый тип int. Когда вы используете операторы if, нет уверенности, что один из операторов if должен работать, и вы получите возвращаемое значение.

if()
{
   return value;
}
if()
{
   return value;

}

В приведенном выше коде оба if могут работать или оба не могут работать если условия не выполнены. поэтому вполне возможно, что мы не получим возвращаемое значение.

и в другом случае, если, в противном случае мы уверены, что один из вариантов определенно будет работать, и мы получим возвращаемое значение 100%

if()
{
   return value;
}
else if()
{
   return value;
}
else{
   return value;
}

в приведенном выше коде будет работать только одно из условий if, и мы всегда будем получать возвращаемое значение.

...