目錄:
一、遞迴是“神馬”?
二、寫一個求階乘的函式
三、課時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課後習題及答案
*******************************