Python 遞迴呼叫
阿新 • • 發佈:2018-12-12
一、函式的遞迴呼叫
指的是在呼叫一個函式的過程,又直接或者間接地呼叫該函式本身,稱之為函式的遞迴呼叫。
遞迴的本質就是一個重複的過程,但是每進入下一次遞迴呼叫時,問題的規模都應該有所減少。
1.1、遞迴的2個階段:
回溯:一層一層的呼叫下去,回溯階段一定要有一個明確的結束條件 。
回溯階段一定要有一個明確的結束條件,並且每一次回溯問題的規模都應該減少(否則就變成了單純的重複,沒有任何意義)
回溯階段舉例:
a=b+1 b=c+1 c=d+1 d=e+1 e=5
遞推:結束當前層的呼叫,進而往前一層一層的結束。
遞推階段舉例:由例1反推得到
e=5 d=e+1 = 5+1=6 c=d+1 = 6+1=7 b=c+1 = 7+1=8 a=b+1 = 8+1=9
例子:回溯與遞迴的使用,拿到第5個人的年齡
# n>1 age(n)=age(n-1)+10
# n=1 age(n)=18
def age(n):
if n == 1:
return 18
if n > 1:
return age(n-1)+10
print(age(5))
58
過程分析:
例子:將列表裡面的值依次取出
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]] def tell(l): for item in l: if type(item) is not list: print(item) else: tell(item) tell(l) 1 2 3 4 5 6 7 8 9
二、遞迴的使用 -- 二分法
二分法:把列表從中間拆分為2段[左邊,右邊],然後判斷,如果不符合要求,在[左邊,右邊]拆分為2段,然後再次判斷
需求:給出一個數字,判斷這個數字是否存在列表裡面(列表的數字是從小到大依次排列的)
l=[1,11,57,89,90,99,100,123,155,188,199,230,255] def search(num,list): print(list) mid_index=len(list) // 2 #把列表長度除以2 if num > list[mid_index]: #list[mid_index]按索引取值,取到的值為列表的中間的一個值,如果num大於這個值,那麼num的值一定在中間值的右邊 #in the right list=list[mid_index+1:] #把中間值往右~~最後的值,這一段數字放在一個列表裡面[右邊列表] search(num,list) #然後再次把值傳入,判斷num是否在"右邊的列表"裡 elif num < list[mid_index]: #in the left list=list[:mid_index] #把中間值往左~~第一個值,這一段數字放在一個列表裡面[左邊列表] search(num,list) #然後再次把值傳入,判斷num是否在"左邊的列表"裡 else: print('find it:',list) search(123,l) # 這裡可以看到,一共查找了4次,就找到了123這個數字 [1, 11, 57, 89, 90, 99, 100, 123, 155, 188, 199, 230, 255] [123, 155, 188, 199, 230, 255] [123, 155, 188] [123] find it: [123]