2011-09-04 16 views
8

私は動的プログラミングについて読んでいました。ダイナミックプログラミングを「反復」と「再帰」のどちらの方法で適用できるのか、それとも1つの方法だけを適用するのがよいのかを知りたかったのです。良い例やリンクがあれば助かります。動的プログラミング再帰的または反復的

答えて

5

動的プログラミングは逆に実装再帰溶液として(多くの場合に)見ることができる。

N口腔内で、再帰では、n=0(またはその他の値)の停止条件を指定してx(n+1) = f(x(n))を計算します。

多くの場合、関数fは最小/最大関数ですが、必ずしもそうである必要はありません。 また、関数は単一の変数をとる必要はありません。

ダイナミックプログラミングは複数の変数で、その後、f(1)その後、f(2)など

f(0)を計算することにより、この問題を解決するだろう、通常の関数を計算するためにいくつかの自然な順序が存在することになります。

動的プログラミングで解決できる例: 3つのゴルフクラブが割り当てられています。各ゴルフクラブは、前方に距離x単位(例えば、24,37および54単位)のゴルフボールを送ることができる。問題は、ちょうど200単位離れた穴を打つことができますか?あなたができるならば、必要なショット数はどれくらいですか? nは、nが0より小さい場合、いくつかの巨大な数0である、と表現場合、これは些細な実装、機能shot(n) 0を返すことが可能になる

shots(200) = min(shots(200-24),shots(200-37),shots(200-54)) 

再帰的な解決策は次のようなものになるだろうそれ以外は上記。

しかし、nの値が大きい場合は、上記の式の異なる枝から同じ値を何度も繰り返し打つことになります。その場合、0から始まり、shots(0)shots(1)shots(2)などを計算する方が良いでしょう。これは、指数関数時間の代わりに線形時間と一定の空間を使用して、この問題に対する "動的プログラミング" )と最高の線形空間(呼び出しスタックの場合)。

+4

memoizationをスローすると、トップダウンアプローチは動的プログラミングと見なされます。ボトムアップDPとトップダウンDPは両方ともDPです。 – harold

+0

@haroldあなたが正しいと思いますが、私はおそらくmemoizationについて何かを追加しておくべきでしょう(メモリ要件を妥当なものにしたい場合は使用するのが少し難しいので、値を "忘れる"それはかなり明確です)。 –

+0

キャッシングを伴う再帰的な解法は、数値のわずかな部分集合を見ますが、反復解法はすべてを調べなければなりません(少なくともそれを避けるのは簡単ではありません)。したがって、この場合、再帰的な解法はより速く実行されるようです。 – AlwaysLearning

関連する問題