1. 程式人生 > >Python-函數遞歸-二分法

Python-函數遞歸-二分法

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 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)

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-函數遞歸-二分法