回答:
動的プログラミングは、再帰アルゴリズムが同じ状況(入力パラメーター)に何度も到達していることがわかった場合に役立ちます。再帰アルゴリズムから、メモ化と呼ばれる動的プログラミングへの一般的な変換があります。これには、再帰プロシージャによって計算されたすべての結果を格納するテーブルがあります。すでに使用された一連の入力に対して再帰プロシージャが呼び出されると、結果はテーブルから取得されます。これにより、再帰フィボナッチが反復フィボナッチに削減されます。
ダイナミックプログラミングはさらにスマートになり、より具体的な最適化が適用されます。たとえば、特定の時点でテーブル全体をメモリに保存する必要がない場合があります。
再帰アルゴリズムを高速化するだけなら、メモ化で十分です。これは、関数呼び出しの結果を保存して、同じパラメーターを使用した今後の呼び出しで結果を再利用できるようにする手法です。これは、関数が
同じパラメーターを使用して関数が何度も呼び出された場合(およびその場合のみ)、時間を節約できます。一般的な例には、フィボナッチ数の再帰的な定義が含まれます。
対照的に、メモ化はマージソートなどのアルゴリズムではほとんど役に立たないことに注意してください。
実際の実装では、結果を保存する方法はパフォーマンスに大きく影響します。ハッシュテーブルを使用することは明らかな選択かもしれませんが、ローカリティが壊れる可能性があります。パラメータが負でない整数である場合、配列は自然な選択ですが、一部のエントリのみを使用する場合は大きなメモリオーバーヘッドが発生する可能性があります。したがって、メモ化は効果とコストのトレードオフです。成果を上げるかどうかは、特定のシナリオによって異なります。
動的プログラミングは、まったく別の獣です。プロパティに関する問題に適用されます
これは通常、人々がベルマンの最適性の原則を呼び出すときに暗示的に暗示されます。
現在、これは特定の種類の再帰によって表現できる問題のクラスのみを説明しています。メモは大きな効果に適用できるため、これらの評価は(多くの場合)効率的です(上記参照)。通常、小さな副問題は多くの大きな問題の一部として発生します。一般的な例には、編集距離とベルマンフォードアルゴリズムが含まれます。