2017-01-10 6 views
1

このアプローチでは、より小さいサブ問題が計算され、結果がキャッシュされ、より小さなサブ問題の既に計算された最適化された値を使用するより大きなサブ問題が計算されます。だから、このアプローチは再帰的か反復的なのでしょうか?Bottom Up動的プログラミングは再帰的ですか?

+1

どちらもありません。 DPは単なるアルゴリズムテクニックです。実際の実装については何も意味しません。その論理が再帰的(同じ問題を縮小して解決すれば、より大きな問題を解く)ということです。 – Paul

答えて

2

ダイナミックプログラミングで使用するapprochは、実際にはinductiveです。再帰的アルゴリズムまたは反復的アルゴリズムのどちらかに建設的帰納的証明を回すことができます。それは単に味の問題です。例えば。 memoizationは再帰的な実装ですが、メモを付けたアルゴリズムごとに反復的なアプローチがあります。

単純な例はフィボナッチ数です。一つは、反復それを書くことができます。

Fib (n) 
{ 
    F_1=F_2=1; 
    For i =3..n 
     F_i = F_i-1 + F_i-2; 
    Return F_n; 
} 

一つは、再帰的にそれを書くことができます。

Define array F of size n; 
    F [1]=F [2]=1; 
    Fib (n) 
    { 
     If (F [n-1]==0) 
      F [n-1] = Fib (n-1); 

     If (F [n-2]==0) 
      F [n-2] = Fib (n-2); 
    F [n]= F[n-2]+F [n-1]; 
    Return F[n]; 
    } 

は、それらの両方は、動的計画法であり、彼らは同じ順序を持っています。状況によっては、再帰的に書き込む方が簡単です。繰り返しが速い場合もあります。

+0

これはとても良い説明だと思います。もう1つのポイント:一部のプログラミング言語は再帰呼び出しを直接サポートしないため、簡単な再帰的実装は不可能です。さらに、明らかにほとんどの人は、それぞれの誘導的な処方が問題の「より良い理解」を示すと考える。私は、「評価の順序」が重要であるという主張を聞いた。しかし、「最初に基底値を評価する必要がある」というように、再帰的な実装でもそうである。 – Codor

+0

私はダイナミックプログラミングについてのみ言及するのではなく、具体的にはボトムUPアプローチの2つの方法のうちの1つについて語っています。私はボトムアップアプローチが反復性であると考えている理由は、再帰のもう一つの特徴があります。解決すべき主な問題から始まり、各再帰の後に基本条件に向かって一歩進んでいきます。しかし、このボトムアップアプローチの場合、基本条件から出発して結果をキャッシュし、今後の結果を評価するために使用します。再帰的ではなく反復的な性質ではないのですか? – Deba

+0

@Deba、私はそれが基本的に誘導だと言った。再帰的アプローチによる誘導に近づくことができます。サイズを基本ケースに縮小することで最大のものを解決します。ここでは、基本ケースは小規模なインスタンスまたは誘導の基本ケースです。もう一つは、それをボトムアップに近づけることができます。問題の根本的な事例を持ち、もっと大きなインスタンスを解決する方法を知り、より大きなインスタンスを解決します。この場合、再帰とボトムアップのアプローチは、誘導を実装するためのツールに過ぎません。それはボトムアップだと言うのはもっと自然だろうと思うかもしれませんが、これは単に味の問題です。 –