Python全棧學習筆記day 17:遞迴函式之:二分法(老男孩Python全棧學習s9 day17 二分法程式有些問題)
阿新 • • 發佈:2018-11-02
遞迴函式
遞迴 : 在函式中呼叫自身函式
最大遞迴深度預設是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))