python學習(二分法)
阿新 • • 發佈:2018-07-22
none span 數據 spa nbsp class python學習 直接 不存在
一. while循環二分
二分查找.每次能排除掉一半的數據.查找的效率非常高.但是局限性比較大,必須是有序的序列才能用二分查找.
要求:
要查找的序列必須是有序序列.
#二分法查找某一個數的索引位置 lst = [11,22,33,44,55,66,77,88,99,111,122,133,144,155,166,177,188,199] n = 122 left = 0 right = len(lst) - 1 # 以索引為邊界 while left<=right: middle = (left + right) // 2 # 取一個在中間位置的索引 ifn >lst[middle]: #如果要查找的數大於列表中索引在中間的元素 left = middle +1 #重新定義邊界,將左邊界向右邊挪一位 elif n < lst[middle]: #如果查找的數小於中間值 right = middle -1 #重新定義邊界,將右邊界向左邊挪一位 else: #如果查找的數等於中間值,直接打印middle print(‘在索引為‘+ str(middle) +‘的位置上!‘) break else: print(‘不存在‘)#結果: #在索引為10的位置上!
二. 函數遞歸二分法
lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 122, 133, 144, 155, 166, 177, 188, 199] def f(left,right ,n): #定義一個函數,給三個形參 middle = (left+right)//2 if n >lst[middle]: left = middle +1 elif n<lst[middle]: right = middle - 1 else:return middle return f(left,right,n) #必須要加return,要不然會返回none,因為它只會返回給調用它的函數 i = f(0,len(lst)-1,99) print(i) #結果: #8
三. 函數遞歸第二種方法(只能查找在不在序列內,不能查找具體位置)
lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 122, 133, 144, 155, 166, 177, 188, 199] def f(lst,n): #因為這個方法會改變列表,所以要將列表作為參數 left = 0 right = len(lst) - 1 middle = (left+right)//2 if middle<0: print(‘沒找到‘) return if n >lst[middle]: lst = lst[middle+1:] #對列表切割 elif n<lst[middle]: lst = lst[:middle-1] else: print(‘找到了‘) return f(lst,n) #遞歸再次調用函數 f(lst, 76) #結果: #沒找到
python學習(二分法)