Как ввести метод while цикла BinarySearch без оператора break? - PullRequest
2 голосов
/ 21 июня 2019

Я только что закончил изучать простой алгоритм BinarySearch, но меня беспокоит одна вещь: меня учили, что операторы break (и continue) часто бывают избыточными в Java, и вы можете обходиться с большинством циклов while без них. Но я не могу понять, как избавиться от подола из цикла показов BinarySearch: -

public static void BinarySearch(int[] list, int key){
int lo = 0;
int hi = list.length-1;
int mid = 0;
while(lo<=hi){
    mid = lo + (hi-lo) / 2;
    if(key<list[mid])
        hi = mid-1;
    else if(key>list[mid])
        lo = mid+1;
    else {
        System.out.println("Key is found at index = " + mid);
        break;
    }
    if(lo>hi){
        System.out.println("Key doesn't exist in the list");
    }
}

Вопрос 1. Почему цикл продолжается и продолжается, если я не включил оператор break? Не должна ли переменная «lo» в конечном итоге стать больше, чем «hi»? Почему последнее условное условие может видеть это, но не условное условие while?

Вопрос 2: Как я могу набрать цикл while без использования оператора break?

1 Ответ

2 голосов
/ 21 июня 2019

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

Например, для вышеуказанного цикла:

int keyIndex = -1;

. . .

while ( (lo<=hi) && (keyIndex == -1) ) {
    . . .
    else {
        System.out.println("Key is found at index = " + mid);
        keyIndex = mid;     // <<< 
    }
    . . .
}

Тем не менее, использование оператора break для таких циклов считается приемлемой практикой программирования для многих разработчиков.

Вот обсуждение reddit по использованию break и continue .

А вот вопрос на родственном сайте по разработке программного обеспечения .

Что касается того, почему ваш цикл не завершается без оператора break, это если ключ найден, значение lo не изменяется.Так что нет, значение lo не обязательно становится больше, чем high .

...