[TIL]フロントエンドDay 6


学習の内容


1. DFS, BFS

  • DFS
    深度優先検索.ナビゲーションツリーをブラウズするときは、最も深いノードを優先的にブラウズします.実際のコードでは、スタックデータ構造または再帰関数の使用を実現します.探索した経路を格納する必要がなく,空間的複雑度が低い経路を優先的に探索する.見つかった解は最適解ではない可能性があり,ループ時に無限ループの危険がある.
  • BFS
    幅を優先して参照します.ナビゲーションツリーでナビゲートする場合は、まず現在の位置にナビゲートする方法です.実際のコードでは,キュー資料構造の使用を実現する.ターゲットノードまでの最短距離を保証しますが、以前のすべてのパスを覚えるには大きなスペースが必要です.
  • 2.グリディ


    グリディアルゴリズムは、総利得ではなく瞬間的な利得を判断するアルゴリズムである.この判断方式は非常に直観的で、必ずしも最適ではない.現在の選択が将来に影響しない場合、I/O制限が大きすぎる場合はGRADYアルゴリズムを使用することを考慮してください.

    3.バックトレース


    完全ナビゲーション(前述のDFSおよびBFS)においてさらに加速されたナビゲーション方法.現在アクセスしているノードが返信される確率が低い場合は、そのノードに接続されているノードのブラウズ(枝切り)は省略される.JavaScriptでは、再帰的なパフォーマンスが悪いため、StackとQueueのデータ構造を使用して実現することが望ましい.

    4. map, filter, reduce


    map


    分割可能データがある場合、関数は、分割可能データの各要素に一定の変更を加えた別の分割可能データを返します.
    const arr = [1, 2, 3, 4, 5];
    const func = a => a + 1;
    console.log(arr.map(func));
    // [2, 3, 4, 5, 6]
    上のアリーprototype.動作はmap()と同じです.しかし、拡張性プロトコルを使用して実装される場合、Arrayを含む拡張性プロトコルに従うすべてのデータに使用することができる.

    filter


    複数のデータの中で条件に一致する要素だけの小さなかわいい関数を返します.
    const arr = [1, 2, 3, 4, 5];
    const func = a => a < 4;
    console.log(arr.filter(func));
    // [1, 2, 3]
    上のアリーprototype.filter()と同様に動作します.

    reduce


    複数の要素を持つ小さな可愛さから1つの値に減少する関数.パラメータは次のとおりです.reduce(function f(a, b), acc, iterable)
  • 減少要素算出方式を有する関数f
  • 初期値と積算のacc
  • データを算出するためのiterableを有する
  • const arr = [1, 2, 3, 4, 5];
    const func = (a, b) => a + b;
    console.log(reduce(func, 0, arr));
    // 15
    上記reduce関数がある場合、その関数の動作順序を以下の再帰構造としてマークする.
    func(func(func(func(func(0, 1), 2), 3), 4), 5);
    上記パラメータではaccは省略可能であり、省略すると基本的にiterableの1番目の要素となり、2番目の要素から計算される.
    reduce(func, arr);
    // 아래와 같은 방식으로 동작한다.
    // (func, [first, ...arr]) => reduct(func, first, arr);
    // func(func(func(func(1, 2), 3), 4), 5);

    5. go, pipe, curry


    go


    前の関数式プログラミングの関数は、結果を単独で使用するのではなく、直接結果を返すので、重ねて使用することができます.しかし、重ねるほど可読性が悪くなり、一番奥の関数から動き始め、人が文章を読む方向とは逆になります.このようなオーバーラップコードの可読性を向上させるために用いられる関数はgo関数である.go関数は、開始値と関数をパラメータとし、パラメータとして順次実行された関数の結果を返します.

    pipe


    すべての関数の実行結果値ではなく、すべての関数を実行する関数を返します.宣言された関数を繰り返し使用できる点はgoとは異なります.

    curry


    Curryは、入力したパラメータの個数によって異なる別の関数を返します.入力したパラメータが指定した数値と同じ場合は実行結果を返し、入力したパラメータが指定した数値より少ない場合は入力したパラメータを保存し、結果を返す関数を返します.
    const add = (a, b) => a + b;
    const curry_add = curry(add);
    const add5 = curry_add(5); 
    
    // a와 b 두개의 인자들 중 a를 5로 저장, 나머지 입력을 받는 함수로 반환한다.
    // add5 = (5, b) => 5 + b;
    // add5 = b => 5 + b;
    

    再表示する内容


    Currying,実装関数式プログラミング(go,pipe)

    に感銘を与える


    プログラミングに触れてから、コマンドプログラミングから離れたことがなく、関数プログラミングを学ぶ機会があり、意味がある.いずれにしても、これは考え方の転換であり、普通に新しいプログラミング言語を勉強しているときの感覚とは違います.関数を変数に格納する概念や表現はまだ理解しにくい.関数式プログラミングに関する問題は時間が短いので、今週はもっと努力しなければなりません.

    Reference


    プログラマフロントエンドプログラムコース