#python #function #search #indexing
#python #функция #Поиск #индексирование
Вопрос:
Детали алгоритма:
Учитывая массив A из n элементов с отсортированными значениями A[0] ≤ A[1] ≤ ... ≤ A[n−1]
и целевым значением x, следующая подпрограмма использует двоичный поиск для поиска индекса x в A.
Вот код, который я написал:
def Binarysearch(A, x):
L = 0
R = len(A)-1
M = (L R)//2
while L<=R:
if A[M] < x:
L = M 1
elif A[M] > x:
R = M-1
else:
return M
return None
ПРОБЛЕМА:
Написав следующие строки, я не получаю результата:
list = [2,3,4,5,12,15,76]
Binarysearch(list, 3)
Я хотел бы понять, в чем проблема.
Я заметил, что если я заменю после условия else: return M с помощью print(M), я получу бесконечную последовательность из 1.
Комментарии:
1. Может быть, вы хотели использовать возвращаемое значение значения функции и распечатать его?
2. Знакомы ли вы с интерактивными онлайн-инструментами — например.
http://www.pythontutor.com/
— если вы просматриваете свой код, легче увидеть, где что-то пошло не так.3. В сторону: не называйте свои переменные
list
; это приведет к запутанным проблемам при попытке использоватьlist
встроенный.
Ответ №1:
Проблема в том, что эта строка:
M = (L R)//2
Должно быть внутри цикла. В противном случае M никогда не обновляется, и вы переходите в бесконечный цикл.
Ответ №2:
Как указывалось в предыдущем сообщении от @BrianMcCutchon, недостаток в коде и рабочем решении. У вас проблема. теперь вы хорошо понимаете проблему.
Я только что предложил same
решение с более описательными именами переменных здесь для вашей справки.
def binary_iterative(A, target):
'''
Return the index of the target, or None if not found.
The array A is in sorted order, and assumed each num. is unique.
'''
left, right = 0, len(A) - 1
while left <= right:
middle_idx = (left right) // 2
middle_num = A[middle_idx]
if middle_num == target:
return middle_idx
elif middle_num < target:
left = middle_idx 1
elif middle_num > target:
right = middle_idx - 1
return None
if __name__ == '__main__':
nums = [1, 3, 4, 5, 6, 9, 10, 12, 17, 20, 22]
target = 5
print(binary_iterative(nums, target))