1. 程式人生 > >遞迴函式與二分查詢演算法

遞迴函式與二分查詢演算法

一、遞迴函式

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