どのようにダイナミックプログラミングの基礎を学んでいる!

3033 ワード

それで、私はちょうどダイナミックなプログラミングへの私の旅行深いダイビングの始まりにいます.私にとって個人的には、コンセプトのためのダイナミックなプログラミングの視覚的な側面に重く頼る必要があります.私を助けるために、私は一歩一歩アルゴリズムを視覚化するためのツールの支援を活用しました.AlgoVizは、問題のサイトです.
今、私は簡単に何をしたいの再帰的なFibonacciアルゴリズムです.
let fib = (n) => {
    if (n <= 2) return 1;
    return fib(n - 1) + fib(n- 2);
};
私はこのアルゴリズムをAlgoVizに入力したときに、次のステップを取得します.
1. fib(3) 
    * call function with integer 3 as an input

2. function declares n = 3

3. evaluate (n <= 2)
    * n is currently 3, which is not less than, or equal to 3

4. evaluate (n - 1)
    * n is 3, subtract 1 and n == 2

5. declare n = 2
    * now n has been reduced to 2 by previous evaluation 

6. evaluate (n <= 2)
    * n = 2, n is less than, or equal to 2

7. call fib(n - 1) 
    * n - 1 = 1
    n is now less than or equal to 2, this is base case
    now the recursive function will start to evaluate the -2 side of the return statement, at this point it will evaluate n at the value of 3 again.

8. evaluate (n - 2)
    * 3 - 2 = 1
    this is a base case

9. declare n = 1
    * function now receives 1 as input

10. evaluate (n <= 2) 
    * 1 is less than or equal to 2

11. call fib(n - 2) = 1
    * base case, no further work to be done

12. return 1 + 1 (return fib(n-1) + fib(n - 1))
    * the value that was left from evaluating the -1 side of the tree was 1, from step 7. The Value from evaluating the -2 side was also 1, from step 11. 1 + 1 = 2. 
このための荒木は次のようになります.
           fib(3)  declaration (n = 3)                                     
              /      \
         -1  /        \   -2                                      
            /          \                                     
          (2)         (1) base                                   
         /              
        /                                
      (1) base   
戻り値は、ベースケースを追加することに由来します.1 + 1 ;
ここでは、ツリーがfib ( 4 )でどのように見えるかを示します.
            fib(4)  declaration (n = 4)                                    
               /      \
         -1   /        \   -2
             /          \
            (3)         (1)
            / \                                 
           /   \                                   
          /     \                                
        (2)     (1)                                                          
         |
         |
        (1)

// 1+1+1 = 3
関数が木の- 1(左)側を評価して、それから- 2側に動くという理解に、私にとって重要でした.ベースケースがステップ7と11でヒットしたら、これを見ることができます.
これは私がまだそれらを学んでいて、視覚的な面がかなり助けていると感じているので、これはmemoizationまたはどんなより高度な概念にも触れません.あなたが初心者なら、私はまた、時間/空間の複雑さと漸近解析を学ぶことをお勧めします!
これが歓呼を助けたならば、これは私の最初のポストです.GH または上で私とリンクしてください!