Почему моя функция рекурсивного поиска не работает?

Мне нужно написать простую рекурсивную функцию, которая просматривает массив от индекса: слева до индекса: справа. Нам не нужно беспокоиться о недопустимых левых и правых входных данных, которые всегда правильны. Если в массиве есть значение, равное ключу, он возвращает индекс этого значения. Если ключа нет в массиве, возвращается -1. Я действительно не знаю, почему моя функция не работает. Я думаю, что должен. Это работает, только если ключ является первым индексом массива.

def binary_search_recursive(array: List[int], left: int, right: int,
                            key: int) -> int:
    if left <= right:
        if array[left] == key:
            return left
        else:
            binary_search_recursive(array, left + 1, right, key)
    return -1

Контрольная работа:

binary_search_recursive([0,1,5,6,23,45], 0, 5, 5)

Должен вернуться:

2

Возвращает:

-1

Ваша else-ветка должна return binary_search_recursive(...). Он должен возвращать все, что возвращает рекурсивный вызов.

Paul M. 18.03.2022 18:18

Это не бинарный поиск. Это бинарный поиск, использующий рекурсию для перечисления каждого элемента.

BrokenBenchmark 18.03.2022 18:19

Да, это называется линейным поиском, когда вы идете по элементу, пока не найдете его. В бинарном поиске вы ищете половину списка, затем половину этой половины и так далее...

Abhyuday Vaish 18.03.2022 18:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
45
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно сделать вкладку во втором возврате. Пытаться:

                            key: int) -> int:
    if left <= right:
        if array[left] == key:
            return left
        else:
            binary_search_recursive(array, left + 1, right, key)
            return -1 #Moved to the right.

Не исправляет. Все еще возвращает -1

BLINAK 18.03.2022 18:18
Ответ принят как подходящий

Чтобы исправить свой код, вам нужно вернуть оператор else:

def binary_search_recursive(array: list[int], left: int, right: int,
                            key: int) -> int:
    if left <= right:
        if array[left] == key:
            return left
        else:
            return binary_search_recursive(array, left + 1, right, key)
    return -1

Но все же это не бинарный поиск.

Обновлено: Настоящий бинарный поиск выглядит примерно так:

def binary_search_recursive(array: list[int], left: int, right: int,
                            key: int) -> int:
    if right >= left:

        center = (right + left) // 2

        if array[center] == key:
            return center

        elif array[center] > key:
            return binary_search_recursive(array, left, center - 1, key)
        else:
            return binary_search_recursive(array, center + 1, right, key)
    return -1

Вам нужно вернуть результат рекурсивного вызова binary_search_recursive():

binary_search_recursive(array, left + 1, right, key)

должно быть

return binary_search_recursive(array, left + 1, right, key)

Обратите внимание, что это нет алгоритм бинарного поиска; вы перечисляете один элемент за раз (используя рекурсию), так что это действительно последовательный поиск.

Другие вопросы по теме

Похожие вопросы

Заказ Binance: отметка времени для этого запроса была на 1000 мс раньше времени сервера
Пометка значений NaN на основе состояния и года
Может ли кто-нибудь написать код для n = 19 строк и получить следующий рисунок? Для Питона
Функция, которая генерирует "n" неповторяющихся неотрицательных случайных целых чисел и возвращает их в виде списка
Добавление нового значения с помощью операции groupby с использованием цикла for
Как добавить ссылку на функцию python в файл json
AttributeError: модуль «keras.api._v2.keras.utils» не имеет атрибута «Последовательный». Я только что запустил нейронную сеть, поэтому помощь будет оценена
Python: я печатаю на консоль и в файл одновременно, но получаю двойные отпечатки при добавлении текста
Применить изменение к последней строке каждой группы по идентификатору в фрейме данных
Как создать ограничение организационной политики с условиями? - ОЦП