Ваш первый даже не начнется, потому что list(mid)
немедленно поднимет TypeError: 'list' object is not callable
.
Если исправить (с помощью list[mid]
), следующая проблема состоит в том, что вы игнорируете min
и max
аргументы, которые вы получаете, и вместо того, чтобы установить их 0
и len(list)-1
каждый раз. Таким образом, вы будете бесконечно возвращаться (до тех пор, пока вы не получите RecursionError
для достижения предела стека).
Подумайте об этом: первый звонок binarySearch(l, 5, 0, 10)
рекурсивно вызывает binarySearch(l, 5, 0, 4)
. Но этот вызов игнорирует это 4
и действует так, как будто вы прошли 10
, поэтому он рекурсивно вызывает binarySearch(l, 5, 0, 4)
. Какой звонит binarySearch(l, 5, 0, 4)
. И так далее.
Если вы исправите это (удалив эти две строки), у вас возникла еще одна проблема. Когда вы даете ему номер 10
, binarySearch(l, 10, 0, 10)
позвонит binarySearch(
л, 10, 6, 10) , which will call
BinarySearch (l, 10, 8, 10)
, то binarySearch(
л, 10, 9, 10) , then
BinarySearch (l, 10, 10, 10)
. И последний будет проверять list[10] > element
. Но list[10]
собирается поднять IndexError
, потому что в нем нет 11 элементов.
И как только вы исправите эту ошибку, проблемы не остались. Проблема, о которой вы просили, не может произойти. Вот пример:
>>> a = range(10)
>>> for i in -3, -1, 0, 1, 4, 5, 9, 10, 11:
... print i, binarySearch(a, i, 0, 10)
-3 False
-1 False
0 0
1 1
4 4
5 5
9 9
10 False
11 False
Ваша вторая версия не является рекурсивной. bSearch
никогда не вызывает bSearch
, и это все определение рекурсии.
Нет ничего плохого в написании итеративного алгоритма вместо рекурсивного алгоритма (если вы не выполняете домашнюю проблему, а рекурсия - это целая точка), но ваша функция также не является итеративной: никаких петель нет.
(Эта версия также игнорирует start
и end
аргументов, но это не так много проблем в этом случае, потому что, опять же, вы не делаете никакой рекурсии.)
Во всяком случае, только return False
в функция находится в этом первом if len(list) == 0
. Таким образом, для любого непустого списка он либо собирается вернуть True
, либо номер. С вашим вводом он вернет 4
для чего-либо меньшего, чем значение в середине списка (5), и True
для чего-нибудь еще.
Первый не может быть действительным кодом, потому что этот 'list (mid)' собирается поднять объект 'TypeError: 'list' не вызываемый'. Если вы хотите, чтобы мы отлаживали ваш код, вы должны показать нам код, который на самом деле демонстрирует проблему, а не просто смутно похожий код. – abarnert
В качестве примечания стороны, 'list',' max' и 'min' - все плохие имена переменных, потому что они являются именами встроенных функций, которые вы можете использовать. – abarnert