Пока цикл не остановится при использовании логической переменной?

1

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

Алгоритм, похоже, работает, он печатает индекс элемента, который я ищу, или "Значение не найдено", когда элемент отсутствует в списке. Но цикл 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)
Теги:
algorithm
recursion
search
binary-search

2 ответа

2
Лучший ответ

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

Поскольку у вас уже есть полная реализация цикла, вместо того, чтобы использовать рекурсию поверх нее (которая вызывает ошибку, связанную с областью), вы можете просто сузить диапазон поиска, переписав 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")
0

Ошибка, которую я совершил, заключалась в том, что я использовал цикл while ON TOP из рекурсивных вызовов, которые в основном являются двумя способами выполнения одного и того же. Для людей, заинтересованных в алгоритме, который использует рекурсию вместо цикла 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")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню