遞迴函式與二分查詢演算法
阿新 • • 發佈:2018-12-10
一、遞迴函式
1.遞迴呼叫的定義
遞迴呼叫是函式巢狀呼叫的一種特殊形式,函式在呼叫時,直接或間接呼叫了自身,就是遞迴呼叫
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
2.遞迴最大深度
最大遞迴深度預設是997/998 —— 是python從記憶體角度出發做得限制
超過遞迴深度會報錯:RecursionError: maximum recursion depth exceeded while calling a Python object
修改遞迴最大深度
import sys sys.getrecursionlimit() sys.setrecursionlimit(2000) n=1 def test(): global n print(n) n+=1 test() test()
二、二分查詢演算法
二分查詢演算法 必須處理有序的列表
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]
你觀察這個列表,這是不是一個從小到大排序的有序列表呀?
如果這樣,假如我要找的數比列表中間的數還大,是不是我直接在列表的後半邊找就行了?
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 = None, end = None): #判斷開始索引值是否為空,如為空返回0 start = start if start else 0 # 判斷結尾索引值是否為空,為空返回整個列表的長度 end = len(l) if end is None else end # 獲取中間值的索引,結尾減開始的索引整除加上開始的索引,比如:(24-0)//2+0就是中間值41的索引 mid_index = ( end - start ) // 2 + start # 判斷開始的索引是否小於或等於結尾索引,大於說明這個值不存在 if start <= end: # 判斷中間值是否大於查詢的值,大於則查詢的值在左邊 if l[mid_index] > aim: # 在呼叫find()查詢,查詢的值在左邊,所開始的索引不變,結尾的索引則是中間值的索引減1 return find(l, aim, start = start, end = mid_index - 1) # 判斷中間值是否小於查詢的值,小於則則查詢的值在右邊 elif l[mid_index] < aim: # 在呼叫find()查詢,查詢的值在右邊,所開始的索引則是中間值的索引加1,結尾的索引不變, return find(l, aim ,start = mid_index + 1, end = end ) # 相等則返回查詢的值的索引值 else:return mid_index else: return None print(find(l,66)) 結果:17