В то время как цикл не останавливается при рекурсивном двоичном поиске

Я пытаюсь запрограммировать алгоритм рекурсивного двоичного поиска на Python. Однако я продолжаю сталкиваться с бесконечным циклом while. Я боюсь, что это должно быть что-то простое, на что я не обращаю внимания, но я нигде не могу найти ответ, большинство вопросов о том, что циклы while не завершаются, используют другие условия, а не логические значения.

Алгоритм действительно работает, он печатает индекс элемента, который я ищу, или «Значение не найдено», если элемент отсутствует в списке. Но цикл while никогда не завершается, даже если я установил found = False после того, как значение было найдено / не найдено. Почему это?

def binarysearch(A, v, x, y):
found = True
while found:
    if x < y:
        h = (x+y) //2
        if A[h] < v:
            binarysearch(A, v, h+1, y)
        else:
            binarysearch(A, v, x, h)
    elif A[x] == v:
        found = False
        print("Element you are looking for is at index {}".format(x))
    else:
        found = False
        print("Value is not in array")

#Code to test the binarysearch algorithm
blist = []
for value in range(0,124):
    if value % 2 ==0:
        blist.append(value)

print(blist)
binarysearch(blist, 68, 0, len(blist)-1)
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
226
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Переменная found, которую вы изменяете с помощью found = False, - это местный для области конкретного рекурсивного вызова binarysearch. Это не экземпляр found, который вы должны изменить пытающийся, то есть тот, который находится на верхнем уровне дерева рекурсии. Таким образом, хотя цикл while в текущей области видимости завершится, циклы в областях выше не будут.

Поскольку у вас уже есть практически полная реализация цикла, вместо использования поверх него рекурсии (которая вызывает ошибку, связанную с областью действия), вы можете просто сузить диапазон поиска, перезаписав x и y.

def binarysearch(A, v, x, y):
    found = True
    while found:
        if x < y:
            h = (x+y) //2
            if A[h] < v:
                x = h+1  // replaced
            else:
                y = h    // replaced
        elif A[x] == v:
            found = False
            print("Element you are looking for is at index {}".format(x))
        else:
            found = False
            print("Value is not in array")

Ошибка, которую я совершил, заключалась в том, что я использовал цикл while ПОВЕРХ рекурсивных вызовов, которые, по сути, являются двумя способами сделать то же самое. Для людей, заинтересованных в алгоритме, который использует рекурсию вместо цикла while, чтобы поддерживать его работу, я предоставил его рабочую версию ниже.

def binarysearch(A, v, x, y):
    if x < y:
        h = (x+y) //2
        if A[h] < v:
            binarysearch(A, v, h+1, y)
        else:
            binarysearch(A, v, x, h)
    elif A[x] == v:
        print("Element you are looking for is at index {}".format(x))
    else:
        print("Value is not in array")

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