[JavaScript]再帰関数


さいきかんすう


再帰関数について説明します.
再帰関数は自分を呼び出す関数です.
関数自体で自分を呼び出し、その中で再び自分を呼び出す...缲り返して
再帰関数は,再帰を停止するbasecaseと,自身を再呼び出しする再帰caseに分けられる.
次のコードは、再帰関数のデフォルトテンプレートです.

再帰関数テンプレート


次のコードは再帰関数のデフォルトテンプレートと言える.
function recursive(input1, input2, ...) {
  // 재귀의 기초 (base case)
  if (문제를 더 이상 쪼갤 수 없을 경우) {
    return 단순한 문제의 해답;
  }
  // recursive Case
  // 그렇지 않은 경우
  return 더 작은 문제로 새롭게 정의된 문제
  // 예1. someValue + recursive(input1Changed, input2Changed, ...)
  // 예2. someValue * recursive(input1Changed, input2Changed, ...)
}
basecaseでは、問題が分裂しない場合は、単純な値を返します.
そうでなければ、同じ演算を実行する必要がある場合は、関数自体を再度呼び出します.recursive caseで発生します.

フィボナッチ数列


0番目は0、1番目は1、2番目の最初の2つの数を加算した数列です.
再帰関数の代表的な例であるフィボナッチ数列を見てみましょう.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
次のコードは、フィボナッチ数列のnum番目の数を検索するコードです.
function fibonacci(num) {
  // 0번째와 1번째는 0, 1로 고정되어 있으므로, 숫자 자신을 리턴해줍니다.
  if (num <= 1) {
    return num;
  }
  
  // 2번째 부터는 본인 자신을 호출합니다.
  return fibonacci(num-2) + fibonacci(num-1);
}

ハノイの塔材貴関数


再帰関数のもう一つの例ハノイのtopアルゴリズム.
ハノイのtopアルゴリズムは、「アルゴリズム」タブに再アップロードされます.
次はコードのみを残します
function hanoi(num, from, to, other) {
  if (num === 0) return;
  hanoi(num-1, from, other, to);
  console.log(`${from}번에서 ${to}로 옮긴다.`);
  hanoi(num-1, other, to, from);
}

hanoi(4, 0, 1, 2);