開發與維運

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

點擊查看上一節:命名空間

遞歸

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

用數字說明:
1! = 1
2! = 1*2 = 2
3! = 1*2*3 = 6
4! = 1*2*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)

結果為:
image.png
顯然也是正確的。

3、創建一個函數,可以用來求任意數的階乘
語法結構:

參數:

        n 為要求階乘的數字

代碼顯示:

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

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

執行結果為:
image.png
而且此時只需要修改需要求階乘的數字即可,就會調用函數來求不同數字的階乘了。

遞歸的概念

遞歸就是一個遞歸式的函數,而且遞歸不是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))

執行結果為:
image.png
之前的課程中我們也講過循環的寫法,兩者基本是類似的,可以互相替換,但是循環編寫起來比較容易,閱讀起來稍難;遞歸編寫起來難,但是方便閱讀。

練習
1、創建一個函數 power 來為任意數字做冪運算 n ** i
2、創建一個函數,用來檢查一個任意的字符串是否是迴文字符串,如果是返回True,否則返回False。
迴文字符串,字符串從前往後念和從後往前念是一樣的。

點擊學習配套視頻課程

獲取更多內容請訂閱Python學習站官方技術圈!

Leave a Reply

Your email address will not be published. Required fields are marked *