函數遞歸和匿名函數(它們的應用)
阿新 • • 發佈:2018-06-14
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.內置函數
函數遞歸和匿名函數(它們的應用)