重新認識動態規劃以及遞迴
阿新 • • 發佈:2019-01-11
A good solution is to keep track of values that have already been computed by storing them in a dictionary!為什麼要把動態規劃與遞迴這兩個概念拿出來說,因為這裡面我認為是有想通的地方的。而且還有很多我們程式設計中需要掌握的一些法則。新羅列一下會提及的原則,
1、DRY原則(不要重複自己!)
2、TDD(對於複雜問題分析的一種方式,自頂向下的分解問題的方法!)
這裡有兩段程式碼,一代是傳統教學上的求解非布拉奇函式的遞迴解
def ficc(n): if n==0 or n==1: return 1 else: return ficc(n-1)+ficc(n-2)
一種是採用了備忘錄方式的,見下
previous = {0:1, 1:1} def fibonacci(n): if previous.has_key(n): return previous[n] else: newValue = fibonacci(n-1) + fibonacci(n-2) previous[n] = newValue return newValue
遞迴以及動態規劃,特別是動態規劃,聽起來就像是一種深不可測的技術,貌似掌握他們就掌握程式設計中的一切,那麼簡單地已我的理解定義一下遞迴和動態規劃:
遞迴:是一種可終止的函式自己呼叫自己的程式設計方式!(可不可以沒有終止,不行,教科書答的,實際上是機器都不允許你不終止,你不終止棧空間很快被吃光而導致程式退出)
動態規劃:將原問題不斷的分解為最優解的過程(很顯然採用TDD思路,中轉將問題細分為許多子問題,由於可以採用備忘錄法儲存子問題的解,自然,我們可以在採取回溯的方式反向得到最優路徑)
DRY原則:採用備忘錄方法儲存中間解,節省不必要的重複計算,所以稱之為別重複自己!(相信第一種遞迴方式存在重複計算的情形大家可以通過畫一個call graph看出來)
TDD:都將大問題分解為小問題求解。