Python-函數遞歸-二分法
阿新 • • 發佈:2017-10-18
class logs 情況下 開始 error: log pri 執行 數值
l=[1,2,10,30,33,99,101,200,301,402] #從小到大排列的數字列表 num=200 for item in l: if num == item: print(‘find it‘) break
此尋找數字的方法,效率低;並且如果查找402,那麽最後break就沒有什麽意思了。
下面用二分法:(一)
l=[1,2,10,30,33,99,101,200,301,402] #從小到大排列的數字列表 def get(num,l): mid=len(l)//2 if num > l[mid]: #in the rightl=l[mid+1:] elif num < l[mid]: #in the left l=l[:mid] else: print(‘find it‘) return get(num,l) get(200,l)
由
def get(num,l): mid=len(l)//2 if num > l[mid]: #in the right l=l[mid+1:] get(num, l)elif num < l[mid]: #in the left l=l[:mid] get(num, l) else: print(‘find it‘) return get(200,l)
得來!
下面開始優化,得到尋找次數,和當前的中間值(二)
l=[1,2,10,30,33,99,101,200,301,402] #從小到大排列的數字列表 def get(num,l): mid=len(l)//2 print(l,l[mid])if num > l[mid]: #in the right l=l[mid+1:] elif num < l[mid]: #in the left l=l[:mid] else: print(‘find it‘) return get(num,l) get(200,l)
問題來了,如果想要取的值不存在呢? get(3,l)
IndexError: list index out of range [1, 2, 10, 30, 33, 99, 101, 200, 301, 402] [1, 2, 10, 30, 33] [1, 2] []
數值不存在的情況下,列表切空了也找不到這個值。
解決方法如下:
l=[1,2,10,30,33,99,101,200,301,402] #從小到大排列的數字列表 def get(num,l): print(l) if len(l) > 0: #列表不為空,則證明還有值是可以執行二分法邏輯的 mid=len(l)//2 if num > l[mid]: #in the right l=l[mid+1:] elif num < l[mid]: #in the left l=l[:mid] else: print(‘find it‘) return get(num,l) else: #列表為空,則證明根本不存在要查找的值 print(‘not exists‘) return get(403,l)
Python-函數遞歸-二分法