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