【python】遞歸聽了N次也沒印象,讀完這篇你就懂了

聽到遞歸總以爲挺高大上的,爲何呢?由於對其陌生,那麼今天就來一文記住遞歸究竟是個啥。函數

不過先別急,一塊兒來看一個問題:求10的階乘(10!)。code

求x的階乘,其實就是從1開始依次乘到x。那麼10的階乘就是 1*2*3*4*5*6*7*8*9*10遞歸

1、非遞歸方式求階乘

假如,咱們在沒接觸過遞歸的狀況下,如何去解決這樣的問題呢?內存

最簡單粗暴的方式 直接print(1*2*3*4*5*6*7*8*9*10)出結果就好了,結果是3628800for循環

可是這種方式顯然不是咱們想要的,那麼能夠試試用for循環的方式來解決。循環

def factorial(n):
    """
    n 就是要求的階乘的數字
    """
    result = n
    for i in range(1, n):
        result *= i

    return result

if __name__ == '__main__':
    print(factorial(10))

2、遞歸方式求階乘

1. 什麼是遞歸?

相信你們必定都聽過這麼一個故事:引用

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

其實這種就是遞歸,說白了,就是本身去引用本身。
那麼,遞歸用在函數中,就能夠是這樣的:總結

def factorial():
    factorial() 

if __name__ == '__main__':
    factorial()

在調用函數factorial的時候 在函數中又繼續調用factorial,跟上面的故事同樣,就能夠無窮無盡的遞歸下去,
直到講故事的老和尚累暈,以及電腦的內存溢出宕機。co

可是,重要的一點,遞歸只是解決問題的一種方式而已,好比上面的求階乘,我用for循環同樣解決。數字

2. 遞歸解決階乘

若是要用遞歸解決上面的階乘問題,能夠再進一步瞭解下遞歸的總體思想。

遞歸的總體思想就是,將一個大問題分解成一個個的小問題,直到問題沒有辦法再繼續分解,因而,再去解決問題。
那麼,遞歸式函數就要知足2個條件:

  • 基線條件:問題能夠被分解爲的最小問題,當知足基線條件時候,遞歸再也不進行
  • 遞歸條件:繼續分解問題
    能夠用這個思想來嘗試用遞歸的方式解決階乘的問題。
10! = 10 * 9!   # 10的階乘其實能夠看作是10 * 9的階乘
9! = 9 * 8!     # 9的階乘能夠看作是9 * 8的階乘
8! = 8 * 7!
...
2! = 2 * 1!
1! = 1

能夠看到,最後分解到1的時候就不可再繼續分解了,那麼1就是基線條件了。

def factorial(n):
    # 基線條件,當知足時,則再也不遞歸
    if n == 1:
        return 1

    # 遞歸條件,當n不等於1時,繼續遞歸
    return n * factorial(n - 1)

if __name__ == '__main__':
    print(factorial(10))

3、總結

  • 遞歸:只是解決問題的一種方式,不必定非要用
  • 遞歸式函數:就是函數本身調用本身
  • 遞歸的2個條件:基線條件(知足則再也不遞歸)、遞歸條件(知足則基線遞歸)
  • 遞歸跟循環相似:基本能夠互相替代
  • 循環編寫起來比較容易,閱讀起來比較難。遞歸編寫起來比較難,可是閱讀容易
相關文章
相關標籤/搜索