python 遞迴
阿新 • • 發佈:2021-08-24
遞迴
遞迴(Recursion Algorithm, 遞迴演算法)通過重複將問題分解為同類子問題而解決問題的方法。
遞迴思想:
- “重複”,即凡是通過迴圈語句可以實現的,都可以通過遞迴來實現
- “將問題分解為同類的子問題”,如持續迴圈的運算操作,持續迴圈的判斷操作,他們的每次迴圈都是同樣的一個“動作”,這個“動作”就是一個子問題。
e.g.1:
1 # -*- ecoding: utf-8 -*- 2 # @ModuleName: rasum 3 # @Function: 4 # @Author: Zhangjie 5 # @Time: 2021/8/23 23:58 67 def ra_sum(start): 8 if start == 1: 9 return start 10 order = ra_sum(start-1) + start 11 print("第%d次遞迴" % start) 12 print('返回值:%d,在記憶體中的地址:%d' % (order, id(order))) 13 return order 14 15 16 #迴圈實現 17 def sum1(start): 18 i = 1 19 add = 0 20 while i <= start:21 add = add + i 22 i += 1 23 return add 24 25 26 27 28 if __name__ == '__main__': 29 #print(sum1(6)) 30 print(ra_sum(6))
輸出結果:
第2次遞迴 返回值:3,在記憶體中的地址:52392096 第3次遞迴 返回值:6,在記憶體中的地址:52392144 第4次遞迴 返回值:10,在記憶體中的地址:52392208 第5次遞迴 返回值:15,在記憶體中的地址:52392288 第6次遞迴 返回值:21,在記憶體中的地址:52392384 21
從示例中可以看出:
每遞迴一次,程式碼在記憶體中開闢新的儲存運算過程的地址空間,記錄運算過程。(你是否曾經有過中間值應該放哪裡的問題)
遞迴演算法其實分縮小範圍和求取結果的層層返回兩大步驟。
遞迴的實質是呼叫棧的進棧,出棧操作過程。
每遞迴呼叫自己一次就進棧一次,並在棧列表裡記錄呼叫的內容,每返回一次就是出棧彈出值的過程,並把值返回到上一個棧列表裡,最終求出結果。
(棧的性質:先進後出,後進先出)
一圖勝千言
思考
1 遞迴演算法的複雜度
2 使用遞迴演算法實現二分查詢
3 如何使用Python內建裝飾器優化遞迴