Ошибка заключается в следующих строках.
elif number < numberlist[mid]:
last = mid
elif number > numberlist[mid]:
first = mid
Рассмотрим случай, когда мы ищем число , которого нет в списке .
Указатели first
, last
и mid
в конечном итоге все сходятся к некоторому индексу.В этом случае одно из двух последних условий будет True
, но, поскольку все три значения уже равны, указатели больше не обновляются, и мы входим в бесконечный цикл.
Чтобы убедиться, что этого не происходит, мы должны убедиться, что интервал всегда уменьшается в размере, задав first
до mid + 1
или last
до mid - 1
, в зависимости от условия.Затем мы можем прекратить зацикливание, если first
станет больше, чем last
.
def binary_search(numberlist, number):
first, last = 0, len(numberlist) - 1
while first <= last:
mid = (first + last) // 2
if numberlist[mid] == number:
return True
elif numberlist[mid] > number:
last = mid - 1
else:
first = mid + 1
return False