2016-12-24 5 views
-1

Я пробовал следующий алгоритм Python для двоичного поиска, который дает мне ошибку непрерывного цикла при поиске значения не в списке, где он должен просто просто давать o/p как «не найден», другой метод, который я пробовал, - это функция, которая хорошо работала, но функции не разрешено использовать, я не понимаю, где ошибка?Бинарный поиск с использованием Python

M = [4,5,6,7,8,9,20,17,45] 
print(M) 
num = int(input("enter the number: ")) 
k=True 
low=0 
high=len(M)-1 
mid=(low-high)//2 
while low<=high: 
print(mid) 
if num == M[mid]: 
    print("Number found") 
    k=False 
    break 
else: 
    if num < M[mid]: 
     high = mid 
     mid = (low+high)//2 
     k=True 

    else: 
     low=mid 
     mid=(mid+high)//2 
     k=True 

if k==True: 
    print("not found") 

В O/P при отображении

[4, 5, 6, 7, 8, 9, 20, 17, 45] ввести номер: , если сказать Eg я дать вход в 25, который дает мне бесконечный цикл ...

+0

Ваших отступов плохо: 'в то время как низкий <= высокие:' имеет ничего отступ после этого, 'break' заявление не является в цикле, и т.д. Пожалуйста, покажите нам код, который фактически дает результат, который вы укажете. См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Правильно отформатируйте свой код путем копирования и вставки из исходного исходного кода, затем выделите код и нажмите кнопку '{}' в редакторе. –

ответ

1

Эй Есть несколько ошибок с вашим кодом,

M = [4,5,6,7,8,9,20,17,45] # Your list is not sorted properly 
M.sort() 
print(M) 
num = int(input("enter the number: ")) 
k=True 
low=0 
high=len(M)-1 
mid=(low+high)//2 # you used (low-high) which is not the way to find the mid value 
while low<=high: 
print(mid) 
if num == M[mid]: 
    print("Number found") 
    k=False 
    break 
else: 
    if num < M[mid]: 
     high = mid - 1 # don't need to consider the mid value again 
     mid = (low+high)//2 
     k=True #you don't need to use this statement every loop 

    else: 
     low=mid + 1 # no need to consider mid again 
     mid=(low+high)//2 # should be low not mid 
     k=True 

if k==True: 
    print("not found") 

Надеется, что это помогло вам :)

0
M = [4,5,6,7,8,9,20,17,45] 
M.sort() # added sort 
print(M) 

num = int(input("enter the number: ")) 
k=True 
low=0 
high=len(M)-1 

while low<high: 
    mid=(high+low)//2 # better place for mid calculating 

    if num == M[mid]: 
    print("Number found") 
    k=False # one k is enough in this while 
    break 
    else: 
    if num < M[mid]: 
     high = mid-1 # you don't need to recheck the mid value in future 
    else: 
     low = mid+1 # you don't need to recheck the mid value in future 

if k==True: 
    print("not found") 
Смежные вопросы