1. 程式人生 > >Python 遞迴呼叫

Python 遞迴呼叫

一、函式的遞迴呼叫

  指的是在呼叫一個函式的過程,又直接或者間接地呼叫該函式本身,稱之為函式的遞迴呼叫。 

  遞迴的本質就是一個重複的過程,但是每進入下一次遞迴呼叫時,問題的規模都應該有所減少。

  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]