2016-12-24 82 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] 輸入號碼: 如果說對於例如I給輸入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")