7月20日火曜日TIL
再帰関数とは
自分の行為を呼ぶ.再帰呼び出しを実行する関数を表します.ここで、再帰呼び出しとは、関数呼び出し自体を指す.再帰関数は、繰り返し処理に使用されます.
回帰とは
何か問題があると仮定して,この問題をより小さな問題に分けることができ,この小さな問題を解決することによって問題全体を解決する方法を回帰と呼ぶ.再帰的なコードを使用すると、多くの場合、より簡潔で分かりやすいという利点があります.
また,アルゴリズム問題の多くの部分を占めている.
復帰する
何か問題があると仮定して,この問題をより小さな問題に分けることができ,この小さな問題を解決することによって問題全体を解決する方法を回帰と呼ぶ.再帰的なコードを使用すると、多くの場合、より簡潔で分かりやすいという利点があります.
また,アルゴリズム問題の多くの部分を占めている.
復帰する
base,recursive case
に分けて記述することができる.再帰的な使用に適している場合
考え直す
再帰関数の入力値と出力値の定義
再帰関数を使用して、解決する問題、すなわち達成する目標を定義します.まず、最も抽象的または最も簡単に問題を定義します.たとえば、関数arrSumの場合、number typeを要素とする配列を入力し、number typeを返します.簡単に言えば、
分割問題と状況数
与えられた問題をどのように解決するかを考えるべきだ.問題を区分する基準を決定し、決定した基準に基づいて、問題を大きい場合と小さい場合に区別します.通常、この基準は入力値として使用されます.このとき重要な観点は,入力値や問題の順序と大きさである.指定された入力値または問題がサイズで区別できる場合、またはソートが明確である場合、問題の区別に役立ちます.また,問題の解き方が順序や大きさに関係なく同じであれば,問題を正しく区別することである.
単純なトラブルシューティング
問題を多くの状況に分けて、最も解決しやすい問題から解決します.これを再帰的基礎
(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つのコードはなぜ同じなのか、疑問があります.
Reference
この問題について(7月20日火曜日TIL), 我々は、より多くの情報をここで見つけました
https://velog.io/@hunsm4n/7월20일-화요일-TIL
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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つのコードはなぜ同じなのか、疑問があります.Reference
この問題について(7月20日火曜日TIL), 我々は、より多くの情報をここで見つけました https://velog.io/@hunsm4n/7월20일-화요일-TILテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol