Почему возврат -1; не является частью условного оператора в вызове алгоритма бинарного поиска Академии Хана?

Я работаю с двоичным файлом Khan Academy. Search Algorithm Challenge, и я просмотрел вопросы, связанные с этой задачей на этом сайте, но не нашел вопроса, подобного моему, связанного с ней.

Мой вопрос: почему выражение return -1; не является частью условного оператора, так что результат -1 возвращается только в том случае, если искомое простое число отсутствует в массиве?

Мне удалось решить задачу самостоятельно, но это потому, что эта часть функции уже задана задачей. Поэтому я не понимаю, почему в приведенной ниже функции return -1; идет в конце после цикла while и, кажется, применяется в любом состоянии. Мне кажется, что это дает результат -1 независимо от того, находится ли targetValue в массиве (хотя на самом деле это не так, и функция работает так, как должна).

/* Returns either the index of the location in the array,
  or -1 if the array did not contain the targetValue */
var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess;
    while(min <= max) {
        guess = Math.floor((max + min)/2);
        if(array[guess]===targetValue) {
            return guess;
        }
        else if(array[guess] < targetValue) {
            min = guess + 1;
        }
        else {
            max = guess - 1;
        }
        println(guess);
    }
    return -1;
};
var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
        41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 73);
println("Found prime at index " + result);

person Salman Oskooi    schedule 05.09.2015    source источник
comment
Из-за return guess; внутри цикла; как только это достигнуто, больше ничего в функции не выполняется.   -  person jonrsharpe    schedule 05.09.2015
comment
Прежде всего, вы знакомы с бинарным поиском? Если нет, сначала почитайте о бинарном поиске (хорошим началом будет страница Википедии). Это традиционная реализация бинарного поиска. Либо targetValue есть в array, либо нет. Если это так, то будет достигнута строка с return guess внутри цикла, поэтому функция останавливается на этом. Если это не так, цикл завершается и достигается return -1.   -  person Filipe Gonçalves    schedule 05.09.2015
comment
@jonrsharpe @Filipe Спасибо, я понял. Но тогда почему return guess появляется только после первого условного выражения в цикле while? Не должно ли оно также появляться в конце выражений else if и/или else, если выполняется любое из этих условий, а не первое условие if?   -  person Salman Oskooi    schedule 05.09.2015
comment
Рассматривали ли вы пошаговое выполнение примера, например. на бумаге или в отладчике? Почему вы ожидаете раннего возврата в случаях, когда вы еще не нашли цель?!   -  person jonrsharpe    schedule 05.09.2015
comment
Вау, теперь я точно понимаю, что ты имеешь в виду, @jonrsharpe! Итак, пока команда return выполняется где это уместно в цикле, команда return, следующая за циклом, будет пропущена. Наверное, я этого не понимал, но теперь обязательно вспомню. Спасибо за помощь. p.s. Я, очевидно, ранний новичок, поэтому спасибо, что терпели меня.   -  person Salman Oskooi    schedule 05.09.2015


Ответы (1)


Если число найдено, оператор return внутри цикла while передаст управление программой вызывающей функции. Другими словами, он выйдет из функции.

Если min > max, это означает, что данное число не может быть найдено, и оно выйдет из цикла while и вернет -1.

person shivam mitra    schedule 05.09.2015