天天看點

遞歸 | Python從入門到精通:高階篇之十一

點選檢視上一節:命名空間

遞歸

首先來看一個例子:求一個數字的階乘。

什麼是階乘?

用數字說明:

1! = 1

2! = 1

*

2 = 2

3! = 1

*

2

*

3 = 6

4! = 1

*

*

3

*

4 = 24

接下來聯系一個例子,10!。

1、直接相乘

#最笨的方法,老老實實的從1相乘到10
print(1*2*3*4*5*6*7*8*9*10)           

但是這個顯然是不友善的,如果是求到100!,1000!。。。呢?

2、用循環求階乘

# 建立一個變量儲存結果
n = 10
for i in range(1,10):
    n *= i
print(n)           

結果為:

遞歸 | Python從入門到精通:高階篇之十一

顯然也是正确的。

3、建立一個函數,可以用來求任意數的階乘

文法結構:

參數:
n 為要求階乘的數字
           

代碼顯示:

def factorial(n):
    # 建立一個變量,來儲存結果
    result = n
    
    for i in range(1,n):
        result *= i

    return result    
# 求10的階乘    
print(factorial(10)) #調用函數即可,并賦予一個參數           

執行結果為:

遞歸 | Python從入門到精通:高階篇之十一

而且此時隻需要修改需要求階乘的數字即可,就會調用函數來求不同數字的階乘了。

遞歸的概念

遞歸就是一個遞歸式的函數,而且遞歸不是Python獨有的,其他語言裡面也會有。

小故事:

從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼故事呢?

從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼故事呢?....

這個故事就可以無限的循環下去了。。這就是遞歸的一種形式。

那麼遞歸簡單了解就是自己去引用自己!

遞歸式函數,就是在函數中自己調用自己!

無窮遞歸:如果這個函數被調用,程式的記憶體會溢出,效果類似于死循環。如下展示:

def fn():
    fn()
fn()           

會造成系統的崩潰,不要随便寫這種函數。

概念

遞歸是解決問題的一種方式,它和循環很像,它的整體思想是,将一個大問題分解為一個個的小問題,直到問題無法分解時,再去解決問題。

遞歸式函數的兩個要件

1.基線條件:問題可以被分解為的最小問題,當滿足基線條件時,遞歸就不在執行了

2.遞歸條件:将問題繼續分解的條件

遞歸和循環

用10!來展示一下遞歸:

10! = 10 * 9!
9! = 9 * 8!
8! = 8 * 7!
 ...
1! = 1           

遞歸的方式:

def factorial(n):
    # 基線條件 判斷n是否為1,如果為1則此時不能再繼續遞歸
    if n == 1 :
        # 1的階乘就是1,直接傳回1
        return 1
    # 遞歸條件    
    return n * factorial(n-1)
print(factorial(10))           
遞歸 | Python從入門到精通:高階篇之十一

之前的課程中我們也講過循環的寫法,兩者基本是類似的,可以互相替換,但是循環編寫起來比較容易,閱讀起來稍難;遞歸編寫起來難,但是友善閱讀。

練習

1、建立一個函數 power 來為任意數字做幂運算 n ** i

2、建立一個函數,用來檢查一個任意的字元串是否是回文字元串,如果是傳回True,否則傳回False。

回文字元串,字元串從前往後念和從後往前念是一樣的。

點選學習配套視訊課程

擷取更多内容請訂閱

Python學習站

官方技術圈!