Я реализовал бинарный поиск в Python по-разному, и я проверял его по отсортированному списку. Итеративное решение терпит неудачу, когда элемент поиска выходит за границы минимальных и максимальных значений списка.
Я провел некоторое начальное тестирование и отладку. Я не могу понять проблему в реализации.
def bisect_search_itr(L, e):
low = 0
high = len(L)
mid_index = (low + high) // 2
while low <= high:
if L[mid_index] == e:
return True
else:
if e > L[mid_index]:
low = mid_index
else:
high = mid_index
mid_index = (low + high) // 2
return False
def bisect_search_rec(L, e):
if L == []:
return False
elif len(L) == 1:
return L[0] == e
else:
half = len(L) // 2
if L[half] > e:
return bisect_search_rec(L[:half], e)
else:
return bisect_search_rec(L[half:], e)
def bisect_search_rec_with_bounds(e, m, n):
if m == n:
return L[m] == e
else:
half = m+n//2
if L[half] == e:
return True
else:
if e < L[half]:
return bisect_search_rec_with_bounds(e, m, half)
else:
return bisect_search_rec_with_bounds(e, half, n)
# Test case
L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
x = 17
print(bisect_search_itr(L, x))
print(bisect_search_rec(L, x))
print(bisect_search_rec_with_bounds(x, 0, len(L) - 1))
У рекурсивных реализаций все в порядке, но для итеративной реализации она сталкивается с бесконечным циклом.