2018.08.05 17:50 1296瀏覽
遞迴的概念很簡單,如果函式包含了對其自身的呼叫,該函式就是遞迴的。
遞迴(recursion),在數學與電腦科學中,是指在函式的定義中使用函式自身的方法。
在使用遞迴時,需要注意以下幾點:
遞迴就是在過程或函式裡呼叫自身
必須有乙個明確的遞迴結束條件,稱為遞迴出口。
注意: 切勿忘記遞迴出口,避免函式無限呼叫。
每乙個遞迴程式都遵循相同的基本步驟:
1.初始化演算法。遞迴程式通常需要乙個開始時使用的種子值(seed value)。要完成此任務,可以向函式傳遞引數,或者提供乙個入口函式,這個函式是非遞迴的,但可以為遞迴計算設定種子值。
2.檢查要處理的當前值是否已經與基線條件相匹配(base case)。如果匹配,則進行處理並返回值。
3.使用更小的或更簡單的子問題(或多個子問題)來重新定義答案。
4.對子問題執行演算法。
5.將結果合併入答案的表示式。
6.返回結果。
基線條件(base case)。基線條件是遞迴程式的最底層位置,在此位置時沒有必要再進行操作,可以直接返回乙個結果。所有遞迴程式都必須至少擁有乙個基線條件,而且必須確保它們最終會達到某個基線條件;否則,程式將永遠執行下去,直到程式缺少記憶體或者棧空間。
遞迴演算法一般用於解決三類問題:
(1)資料的定義是按遞迴定義的。(比如fibonacci函式)
(2)問題解法按遞迴演算法實現。(回溯)
(3)資料的結構形式是按遞迴定義的。(比如樹的遍歷,圖的搜尋)
n! = 1 × 2 × 3 × … × n
也可以用遞迴方式定義:
n! = (n-1)! × n
其中,n >= 1,並且 0! = 1。
由於簡單、清晰,因此其常被用作遞迴的示例。
ps: 除了階乘以外,還有很多演算法可以使用遞迴來處理,例如:斐波那契數列、漢諾塔等。
非遞迴實現
def factorial(n):階乘函式的遞迴實現result = 1
for i in range(2, n+1):
result *= i
return result
def factorial(n):為了明確遞迴步驟,對 5! 進行過程分解:if n == 0 or n == 1: return 1
else: return (n * factorial(n - 1))
factorial(5) # 第 1 次呼叫使用 5還是這個函式factorial(n),讓我們試試n = 999和n = 1000,問題來了,n = 999時能輸出正確答案,但當n = 1000時,就出現下面的錯誤了:5 * factorial(4) # 第 2 次呼叫使用 4
5 * (4 * factorial(3)) # 第 3 次呼叫使用 3
5 * (4 * (3 * factorial(2))) # 第 4 次呼叫使用 2
5 * (4 * (3 * (2 * factorial(1)))) # 第 5 次呼叫使用 1
5 * (4 * (3 * (2 * 1))) # 從第 5 次呼叫返回
5 * (4 * (3 * 2)) # 從第 4 次呼叫返回
5 * (4 * 6) # 從第 3次呼叫返回
5 * 24 # 從第 2 次呼叫返回
120 # 從第 1 次呼叫返回
runtimeerror: maximum recursion depth exceeded
於是,請記住,預設的python有乙個可用的遞迴深度的限制,以避免耗盡計算機中的記憶體。預設是1000。
優點:遞迴使**看起來更加整潔、優雅
可以用遞迴將複雜任務分解成更簡單的子問題
使用遞迴比使用一些巢狀迭代更容易
缺點:遞迴的邏輯很難除錯、跟進
遞迴演算法解題的執行效率較低。在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等。
25 遞迴演算法詳解
a方法呼叫b方法,我們很容易理解!遞迴就是 a方法呼叫a方法!就是自己呼叫自己,因此我們在設計遞迴演算法時,一定要指明什麼時候自己不呼叫自己。否則,就是個死迴圈!遞迴演算法要點 遞迴是一種常見的解決問題的方法,即把問題逐漸簡單化。遞迴的基本思想就是 自己呼叫自己 乙個使用遞迴技術的方法將會直接或者間...
python遞迴 演算法 遞迴(Python解釋)
通俗一點來說,遞迴就是一種在函式內呼叫自己的演算法。每一級呼叫都會有自己的引數。每一次呼叫都會有一次返回。可能是返回自己,繼續遞迴 也可能是返回特定值,結束遞迴。遞迴解釋 優點 直觀,實現簡單,可讀性好。缺點 會有重複的呼叫 優化裡會說明 占用空間大,遞迴太深,會造成棧溢位 呼叫太多,不給你呼叫了 ...
python遞迴實現 遞迴演算法 python實現
在函式的定義中對這個函式自身的呼叫,就是遞迴。遞迴結構中,遞迴的部分必須比原來的整體簡單,才有可能到達某種終結點 出口 而且必須存在非遞迴的基本結構構成的部分,否則會無限遞迴。學習目標 程式設計實現斐波那契數列求值 f n f n 1 f n 2 程式設計實現求階乘 n 程式設計實現一組資料集合的全...