數據結構(Python) —— 【04 遞回】

2020-08-09 01:41:22

遞回

遞回應該放在漢諾塔問題之前講的,因爲漢諾塔問題就是用遞回解決的,所以今天補上!
遞回是個很基礎的知識點,我記得大學C語言的前面就講了遞回,可見遞回是個簡單卻又重要的知識點!
遞回的具體文字解釋,我就不說了,簡單來說,遞回就是不斷呼叫自己,直到達到終止條件。
所以, 遞回的兩個特點: 呼叫自身、結束條件
我就簡單句幾個例子說明一下:

1. def func1(x):
       print(x)
       func1(x-1)

沒有結束條件,我們都不知道到遞回什麼時候結束,所以不是合法的遞回

2. def func2(x):
       if x > 0:
          print(x)
          func2(x+1)

看似有結束條件x>0,即當x<=0時結束,但x+1會永遠大於0,即依然不會結束,故相當於沒有結束條件,不是合法的遞回
所以,遞回是否有結束條件,不能只看程式碼裡是否有判斷條件,還要結合程式碼,判斷遞回結束條件是否有效

3. def func3(x):
       if x > 0:
          print(x)
          func3(x-1)

是合法遞回

用遞回計算階乘

n的階乘=nx(n-1)x(n-2) x…x2x1
比如5的階乘即爲5x4x3x2x1=120
下面 下麪看看程式碼:

def func(n):
    s = 0
    if n == 1:
        return 1
    else:
        s = n * func(n - 1)
    return s

先定義s,來儲存階乘的乘積,再加結束條件。因爲階乘最多就是乘到1,所以我們判斷當n減到1時,就返回1,不然就一直呼叫自己本身。

舉個栗子——5:
5≠1,所以此時s=5*func(4);
再看func(4):
n=4≠1,所以func(4)=4*func(3),此時s=5*4*func(3);
再看func(3):
n=3≠1,所以func(3)=3*func(2),此時s=5*4*3*func(2);
再看func(2):
n=2≠1,所以func(2)=2*func(1),此時s=5*4*3*2*func(1);
再看func(1):
n=1,則此時函數返回1,即func(1)=1,所以此時s=5*4*3*2*1=120

再用程式驗證一下:

def func(n):
    s = 0
    if n == 1:
        return 1
    else:
        s = n * func(n - 1)
    return s
print(func(5))

結果爲120,正確!