1. 程式人生 > >Python全棧學習筆記day 17:遞迴函式之:二分法(老男孩Python全棧學習s9 day17 二分法程式有些問題)

Python全棧學習筆記day 17:遞迴函式之:二分法(老男孩Python全棧學習s9 day17 二分法程式有些問題)

遞迴函式
    遞迴  : 在函式中呼叫自身函式
    最大遞迴深度預設是997/998 —— 是python從記憶體角度出發做得限制

二分法:

實現程式:

最基礎版:(很多問題:切分導致出現了新列表,無法返回元素在 l 中的位置)

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(l,aim):
    mid_index = len(l) // 2
    if l[mid_index] == aim:
        print('找到啦,位置是:',mid_index)
    elif l[mid_index] < aim:
        new_l = l[mid_index + 1:]
        find(new_l,aim)
    elif l[mid_index] > aim:
        new_l = l[:mid_index]
        find(new_l, aim)
    else:
        print('找不到')

find(l,22)

進階版:(沒有產生新列表,但是輸出的值只是列印而且,不能ruturn返回)

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def find(l,aim,start = 0,end = None):
    end = len(l) if end is None else end   # end = len(l)   24
    mid_index = (end - start)//2 + start   #計算中間值  12 + 0 = 12
    if l[mid_index] < aim:       #l[12] < 44   #41 < 44
        find(l,aim,start =mid_index+1,end=end)  # find(l,44,start=13,end=24)
    elif l[mid_index] > aim:
        find(l, aim, start=start, end=mid_index-1)
    else:
        print('找到了',mid_index,aim)


老師給出的最終版:(解決了以上所有問題,但是一旦輸入的aim超過了列表最大的值(這裡是最大值是88),就會報錯,原因是列表溢位,就是mid_index會超過l的最大長度(這裡最大長度是25),而l[mid_index]就會報錯

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def find(l,aim,start = 0,end = None):
    end = len(l) if end is None else end
    mid_index = (end - start)//2 + start
    if start <= end:
        if l[mid_index] < aim:
            return find(l,aim,start =mid_index+1,end=end)
        elif l[mid_index] > aim:
            return find(l, aim, start=start, end=mid_index-1)
        else:
            return mid_index
    else:
        return '找不到這個值'


find(l,22)

最最最最最終版:

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

def find(l,aim,start = 0,end = None):
    end = len(l) if end is None else end
    mid_index = (end - start)//2 + start
    if mid_index < len(l):
        if start <= end:
            if l[mid_index] < aim:
                return find(l,aim,start =mid_index+1,end=end)
            elif l[mid_index] > aim:
                return find(l, aim, start=start, end=mid_index-1)
            else:
                return mid_index

        else:
            return '找不到這個值'
    else:
        return '找不到這個值'

print(find(l,100))