JavaScript | 再帰とループの性能比較

JavaScript JavaScript
スポンサーリンク

では「再帰を直感的に書けるけれど、ループに書き換えるとどうなるか」を比較してみましょう。これで「どちらを選ぶべきか」の感覚がさらに磨かれます。


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

再帰版(直感的で短い)

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

ループ版(書き換え)

function sumNestedLoop(arr) {
  let sum = 0;
  let stack = [...arr]; // 自分でスタックを用意

  while (stack.length > 0) {
    const item = stack.pop();
    if (Array.isArray(item)) {
      stack.push(...item); // 配列なら展開して積み直す
    } else {
      sum += item;
    }
  }
  return sum;
}

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

👉 違い

  • 再帰版は「配列ならもう一度呼ぶ」という自然な表現。
  • ループ版は「自分でスタックを管理」する必要があり、コードが長くなる。

例2:文字列の反転

再帰版

function reverseRec(str) {
  if (str === "") return "";
  return reverseRec(str.slice(1)) + str[0];
}

console.log(reverseRec("hello")); // "olleh"
JavaScript

ループ版

function reverseLoop(str) {
  let result = "";
  for (let i = str.length - 1; i >= 0; i--) {
    result += str[i];
  }
  return result;
}

console.log(reverseLoop("hello")); // "olleh"
JavaScript

👉 違い

  • 再帰版は「残りを反転 + 先頭を最後に付ける」という直感的な定義。
  • ループ版は「インデックスを逆順に回す」という手続き的な書き方。

✅ まとめ

  • 再帰 → コードが短く直感的(特に入れ子構造や分割統治)
  • ループ → 高速で安全(大量データや単純処理に強い)

👉 次のステップとしては「実際に自分で再帰をループに書き換える練習」をやってみると理解が深まります。

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