JavaScript | 再帰関数

JavaScript JavaScript
スポンサーリンク

それでは「ループ」と「再帰」を並べて比較してみましょう。両方で同じ処理を書いてみると、違いがすごく分かりやすくなります。


例1:1からnまで数える

ループ版

for (let i = 1; i <= 5; i++) {
  console.log(i);
}
JavaScript

再帰版

function countUp(n, current = 1) {
  if (current > n) return;   // 終了条件
  console.log(current);
  countUp(n, current + 1);   // 次へ
}

countUp(5);
JavaScript

👉 違い:

  • ループは「変数を回す」イメージ。
  • 再帰は「同じ関数を呼び直す」イメージ。

例2:配列の合計

ループ版

const arr = [2, 4, 6];
let sum = 0;
for (let i = 0; i < arr.length; i++) {
  sum += arr[i];
}
console.log(sum); // 12
JavaScript

再帰版

function sumArray(arr, i = 0) {
  if (i === arr.length) return 0;   // 終了条件
  return arr[i] + sumArray(arr, i + 1);
}

console.log(sumArray([2, 4, 6])); // 12
JavaScript

👉 違い:

  • ループは「配列を順番に回す」。
  • 再帰は「先頭 + 残りの合計」という形で分割。

例3:ネストした配列の合計

ループで書くと大変

// ネストの深さが決まっていれば書けるけど、
// 深さが不明だとループだけでは難しい。
JavaScript

再帰版(シンプル!)

function sumNested(arr) {
  let sum = 0;
  for (const item of arr) {
    if (Array.isArray(item)) {
      sum += sumNested(item);   // 再帰で深く潜る
    } else {
      sum += item;
    }
  }
  return sum;
}

console.log(sumNested([1, [2, [3, 4]], 5])); // 15
JavaScript

👉 違い:

  • ループは「深さが決まっているとき」に強い。
  • 再帰は「深さが分からない入れ子構造」に強い。

まとめ

処理方法得意な場面
ループ繰り返し回数がはっきりしているとき(for, while)
再帰問題を「同じ形に分割」できるとき、ネスト構造や木構造の探索

こうして並べると「ループと再帰は同じこともできるけど、得意分野が違う」って見えてきます。

タイトルとURLをコピーしました