7月20日火曜日TIL


再帰関数とは


自分の行為を呼ぶ.再帰呼び出しを実行する関数を表します.ここで、再帰呼び出しとは、関数呼び出し自体を指す.再帰関数は、繰り返し処理に使用されます.

回帰とは


何か問題があると仮定して,この問題をより小さな問題に分けることができ,この小さな問題を解決することによって問題全体を解決する方法を回帰と呼ぶ.再帰的なコードを使用すると、多くの場合、より簡潔で分かりやすいという利点があります.
また,アルゴリズム問題の多くの部分を占めている.

復帰する

  • 再帰思考法
  • 細分思考法
  • 再帰的思考=>再帰的思考練習により,再帰的関数をbase,recursive caseに分けて記述することができる.
  • 関数自身の再帰呼び出し
  • 脱出条件
  • 再帰関数の使用
  • ツリー構造で再帰関数
  • を使用
  • JSONは、DOM構造において再帰関数
  • を用いる

    再帰的な使用に適している場合

  • 与えられた問題がより小さな問題に分割できる場合、
  • .
  • 重複文が多い、または重複文の重複回数が予測しにくい場合、
  • .

    考え直す


    再帰関数の入力値と出力値の定義


    再帰関数を使用して、解決する問題、すなわち達成する目標を定義します.まず、最も抽象的または最も簡単に問題を定義します.たとえば、関数arrSumの場合、number typeを要素とする配列を入力し、number typeを返します.簡単に言えば、
  • arrSum: [number] => number
  • 分割問題と状況数


    与えられた問題をどのように解決するかを考えるべきだ.問題を区分する基準を決定し、決定した基準に基づいて、問題を大きい場合と小さい場合に区別します.通常、この基準は入力値として使用されます.このとき重要な観点は,入力値や問題の順序と大きさである.指定された入力値または問題がサイズで区別できる場合、またはソートが明確である場合、問題の区別に役立ちます.また,問題の解き方が順序や大きさに関係なく同じであれば,問題を正しく区別することである.

    単純なトラブルシューティング


    問題を多くの状況に分けて、最も解決しやすい問題から解決します.これを再帰的基礎(base case)と呼ぶ.再帰の基礎は,後で再帰関数を実現する場合の再帰の終了条件(再帰呼び出し停止の条件)を構成する.

    複雑な問題を解決する.


    他人の複雑な状況を解決する.

    インプリメンテーションコード

    function recursive(input1, input2, ...) {
    	// Base Case: 문제를 더 이상 쪼갤 수 없는 경우
      if(문제를 더 이상 쪼갤 수 없을 경우) {
        return 단순한 문제의 해답;
    }
       // recursive Case
       // 그렇지 않은 경우
      return 더 작은 문제로 새롭게 정의된 문제;
      // ex. someValue + recursive(inputChanged, inputChanged2)

    その他


    すべての再帰関数は、繰り返し文(while or for文)で表すことができます.
    slice = immutable? + spread operator = immutable
    let [head, ...tails] = arr; 
    let head = arr[0];
    let tail = arr.slice(1);

    注釈

    function arrLength(arr) {
      if(arr.isEmpty() === true){
        return 0;
      }
      let head = 1;
      let tail = arr.slice(1);
    
      return head + arrLength(tail);
    }
    function arrLength(arr) {
      if(arr.isEmpty() === true){
        return 0;
      }
     
      let [head, ...tail] = arr;
    
      return 1 + arrLength(tail);
    }
    この2つのコードはなぜ同じなのか、疑問があります.