Python遞迴演算法詳解

2021-09-24 16:21:27 字數 2187 閱讀 3147

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):

if n == 0 or n == 1: return 1

else: return (n * factorial(n - 1))

為了明確遞迴步驟,對 5! 進行過程分解:

factorial(5)                        # 第 1 次呼叫使用 5

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 次呼叫返回

還是這個函式factorial(n),讓我們試試n = 999和n = 1000,問題來了,n = 999時能輸出正確答案,但當n = 1000時,就出現下面的錯誤了:

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 程式設計實現一組資料集合的全...