課時22:函式:遞迴是神馬

那是個好男孩發表於2018-08-15

目錄:

  一、遞迴是“神馬”?

  二、寫一個求階乘的函式

  三、課時22課後習題及答案

 

*********************

一、遞迴是“神馬”?

*********************

遞迴這個概念,是演算法的範疇。那麼遞迴演算法在日常程式設計中有哪些例子呢?

            圖片一 漢諾塔遊戲

            圖片二 樹結構的定義

            圖片三 謝爾賓斯基三角形

            圖片四 女神自拍

 

遞迴,從原理上來說就是函式呼叫自身的一個行為。你沒聽錯,在函式內部,你可以呼叫所有可見的函式,當然包括自己。

舉個例子:

>>> def recursion():
    return recursion()

>>> recursion()
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    recursion()
  File "<pyshell#2>", line 2, in recursion
    return recursion()
  File "<pyshell#2>", line 2, in recursion
    return recursion()
  File "<pyshell#2>", line 2, in recursion
    return recursion()
  [Previous line repeated 990 more times]
RecursionError: maximum recursion depth exceeded

這個例子嘗試了初學者玩遞迴最容易出現的錯誤。從理論上來講,這個程式會一直執行下去,直到消耗完所有的記憶體資源。不過Python出於善意的保護,對遞迴的深度預設限制為100層,所以程式碼才會停下來。不過如果使用寫網路爬蟲的工具,可能會爬的很深,那你也可以自己設定遞迴的深度限制。方法如下:

>>> import sys
>>> sys.setrecursionlimit(1000000)#將遞迴限制設定為100萬層

可用ctrl + c 讓程式停止。

 

****************************

二、寫一個求階乘的函式

*****************************

寫一個求階乘的函式
---正整數階乘指從1乘以2乘以3乘以4一直乘到所要求的數。
---例如所給的數是5,則階乘式是1×2×3×4×5,得到的積是120,所以120就是4的階乘。

非遞迴版本:

def factorial(n):
    result = n
    for i in range(1, n):
        result *= i

    return result

number = int(input('請輸入一個正整數:'))
result = factorial(number)
print("%d 的階乘是:%d" % (number, result))

遞迴版本:

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

number = int(input('請輸入一個正整數:'))
result = factorial(number)
print("%d 的階乘是:%d" % (number, result))

程式實現結果:

請輸入一個正整數:5
5 的階乘是:120

 

我們說麻雀雖小,卻五臟俱全。這個例子滿足了遞迴的兩個條件:

(1)呼叫了函式的本身。

(2)設定了正確的返回條件。

上面程式的詳細分析如圖所示:

不要忘了,遞迴的實現可以是函式自個兒呼叫自個兒,每次函式的呼叫都需要進行壓棧,彈棧,儲存和恢復暫存器的棧操作,所以在這上邊是非常消耗時間和空間的。

另外,如果遞迴一直忘了返回,或者錯誤的設定了返回條件,那麼執行這樣的遞迴程式碼就會變成一個無底洞:只進不出!所以在寫遞迴程式碼時,要記住:遞迴遞迴,歸去來兮!

 

*******************************

三、課時22課後習題及答案

*******************************

 

相關文章