1. 程式人生 > >重新認識動態規劃以及遞迴

重新認識動態規劃以及遞迴

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:都將大問題分解為小問題求解。