Javascript Алгоритм двоичного поиска не может найти номер в списке - PullRequest
1 голос
/ 18 февраля 2020

Следующий код не может найти номер в списке. Почему это может быть?

Попытка сделать это с номером для поиска как '9' и массивом чисел, состоящим из чисел между 1-10 включительно.

array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
count = 0;

function binarySearch(array, number) {
    mid = Math.floor(array.length / 2);
    if (number === array[mid]) {
        return count;
    }

    else if (number < array[mid] && array.length > 1) {
        count++;
        arrayFirst = array.splice(0, array[mid]);
        console.log("Tried: ", array[mid])
        console.log(arrayFirst);
        return binarySearch(arrayFirst, number);
    }

    else if (number > array[mid] && array.length > 1) {
        count++;
        arraySecond = array.splice(array[mid], array.length);
        console.log("Tried: ", array[mid])
        console.log(arraySecond);
        return binarySearch(arraySecond, number);
    }

    else {
        return 'number doesnt exist';
    }


}
console.log(binarySearch(array, 4));
Код теперь пытается найти число 10 Новое редактирование:

       array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13,14,15,16,17,18,19,20];
    count = 0;
    
    function binarySearch(array, number) {
        mid = Math.floor(array.length/ 2);
        if (number === array[mid]) {
            return count;
        }
    
        else if (number < array[mid] && array.length > 1) {
            count++;
            arrayFirst = array.splice(0, mid);
            console.log("Tried: ", array[mid])
            console.log(arrayFirst);
            return binarySearch(arrayFirst, number);
        }
    
        else if (number > array[mid] && array.length > 1) {
            count++;
            arraySecond = array.splice(array[mid], mid);
            console.log("Tried: ", array[mid])
            console.log(arraySecond);
            return binarySearch(arraySecond, number);
        }
    
        else {
            return 'number doesnt exist';
        }
    
    
    }
    
    console.log(binarySearch(array, 10));

Ответы [ 4 ]

3 голосов
/ 18 февраля 2020

Это:

array = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;

не является массивом, оно интерпретируется как список инициализации, например так:

 array = 1, x = 2, y = 3...;

, поэтому ваш array равен 1 и не весь список. Также имейте в виду, что Не рекомендуется объявлять переменную без ключевого слова var. Он может случайно перезаписать существующую глобальную переменную. Вместо этого следует использовать var, let или const в зависимости от использования этой переменной

Вместо этого это должен быть ваш массив:

array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
1 голос
/ 18 февраля 2020

Вы используете array.splice(0, array[mid])

array[mid] - это значение в массиве, и вам необходимо вычесть количество элементов array.splice(0, mid) склеить документы

также индекс начинается с 0, поэтому ваш array[mid] берет 6-й элемент, а не середину.

1 голос
/ 18 февраля 2020

Некоторые изменения:

  • Возьмите подсчет внутри функции, возвращая либо один, либо ноль, либо один плюс результат вызова с подмассивом.

  • Проверьте длину заранее (орфография имеет значение ... arr) и верните ноль для недостижимых значений.

  • Использование Array#slice вместо Array#splice (предотвратите мутацию) и возьмите индекс, а не значение элемента.

  • Наконец, верните один плюс счетчик левая или правая сторона.

function binarySearch(array, number) {
    console.log(...array);
    var mid = Math.floor(array.length / 2);
  
    if (number === array[mid]) return 1;
    if (array.length <= 1) return 0;

    return number < array[mid]
        ? 1 + binarySearch(array.slice(0, mid), number)
        : 1 + binarySearch(array.slice(mid), number);
}

console.log('count:', binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 4));
1 голос
/ 18 февраля 2020

Здесь несколько указателей:

  • Ваше условие содержит неопределенную переменную arr. Вы использовали array.

  • Ваш массив должен быть array = [1,2,3]

  • Я бы предложил создать экземпляр ваших переменных arrayFirst, mid, arraySecond как const const mid = ..., так что они имеют область видимости блока, а не глобальные переменные

Редактировать: похоже, что вы изменили условие arr. Пожалуйста, избегайте изменений, поскольку это делает ответы неуместными.

...