1. 程式人生 > >函數遞歸和匿名函數(它們的應用)

函數遞歸和匿名函數(它們的應用)

ID 有意義 IV earch IT 函數 循環 作用域 過程

一、函數遞歸

函數遞歸調用(是一種特殊的嵌套調用):在調用一個函數的過程中,又直接或間接地調用了該函數本身

遞歸必須要有兩個明確的階段:
遞推:一層一層遞歸調用下去,強調每進入下一層遞歸問題的規模都必須有所減少
回溯:遞歸必須要有一個明確的結束條件,在滿足該條件時結束遞推
開始一層一層回溯

遞歸的精髓在於通過不斷地重復逼近一個最終的結果。
#直接調用本身
def f1():
    print(‘from f1‘)
    f1()
f1()

#間接調用本身
def f1():
    print(‘from f1‘)
    f2()

def f2():
    print(‘from f2‘)
    f1()
f1()



eg1:取出下面列表中所有值
items=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,]]]]]]]]]]
def tell(l):
for item in l:
if type(item) is not list:
print(item)
else:
tell(item)




eg2:二分法:一個從小到大排列的整型數字列表
l=[1,2,3,4,5,6,7,8,9,10,11]
def search(n,l):
print(l)
if len(l)==0:
print(‘not exist‘)
return
mid_index=len(l)//2
if n>l[mid_index]:
l=l[mid_index+1:]
search(n,l)
elif n<l[mid_index]:
l=l[:mid_index]
search(n,l)
else:
print(‘find it ‘)
search(2,l)

二、匿名函數

1.什麽是匿名函數?

匿名就是沒有名字
def func(x,y,z=1):
    return x+y+z

匿名
lambda x,y,z=1:x+y+z #與函數有相同的作用域,但是匿名意味著引用計數為0,使用一次就釋放,除非讓其有名字
func=lambda x,y,z=1:x+y+z 
func(1,2,3)
#讓其有名字就沒有意義



2.與有名字函數區別
有名函數:循環使用,保存了名字,通過名字就可以重復引用函數功能

匿名函數:一次性使用,隨時隨時定義

應用:max,min,sorted,map,reduce,filter
3.內置函數

技術分享圖片





函數遞歸和匿名函數(它們的應用)