1. 程式人生 > >python學習(二分法)

python學習(二分法)

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  # 取一個在中間位置的索引
    if
n >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學習(二分法)