遞歸函數和匿名函數

1. 遞歸函數

在函數內部,能夠調用其餘函數。若是一個函數在內部調用自身自己,這個函數就是遞歸函數。數據結構

def calc(n):
    print(n)
    if int(n/2) ==0:
        return n
    return calc(int(n/2))

calc(10)

輸出:
10
5
2
1

遞歸特性:ide

  1. 必須有一個明確的結束條件函數

  2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小code

  3. 遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出)

遞歸函數實際應用案例,二分查找

data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]

def binary_search(dataset,find_num):
    print(dataset)

    if len(dataset) >1:
        mid = int(len(dataset)/2)
        if dataset[mid] == find_num:  #find it
            print("找到數字",dataset[mid])
        elif dataset[mid] > find_num :# 找的數在mid左面
            print("找的數在mid[%s]左面" % dataset[mid])
            return binary_search(dataset[0:mid], find_num)
        else:# 找的數在mid右面
            print("找的數在mid[%s]右面" % dataset[mid])
            return binary_search(dataset[mid+1:],find_num)
    else:
        if dataset[0] == find_num:  #find it
            print("找到數字啦",dataset[0])
        else:
            print("沒的分了,要找的數字[%s]不在列表裏" % find_num)

binary_search(data,66)

2. 匿名函數

匿名函數就是不須要顯式的指定函數遞歸

#這段代碼
def calc(n):
    return n**n
print(calc(10))

#換成匿名函數
calc = lambda n:n**n
print(calc(10))

匿名函數主要是和其它函數搭配使用,以下:it

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)
相關文章
相關標籤/搜索