それでは「再帰を使うと逆に読みにくくなる例」を見てみましょう。
再帰は便利ですが、必ずしも「短い=分かりやすい」ではないんです。
例1:単純なカウントアップ
ループ版(シンプル)
for (let i = 1; i <= 10; i++) {
console.log(i);
}
JavaScript再帰版(わざわざ複雑)
function countUp(n, current = 1) {
if (current > n) return;
console.log(current);
countUp(n, current + 1);
}
countUp(10);
JavaScript👉 違い
- ループは1行で済む。
- 再帰は「終了条件」「引数の管理」が必要で、かえって長くなる。
例2:配列の合計(小さな配列)
ループ版
const arr = [1, 2, 3, 4, 5];
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
console.log(sum); // 15
JavaScript再帰版
function sumArray(arr, i = 0) {
if (i === arr.length) return 0;
return arr[i] + sumArray(arr, i + 1);
}
console.log(sumArray([1, 2, 3, 4, 5])); // 15
JavaScript👉 違い
- 配列が小さいならループの方が直感的。
- 再帰は「関数呼び出しのオーバーヘッド」があり、パフォーマンス的にも不利。
再帰が読みにくくなる典型パターン
- 繰り返し回数が明確な処理(例: 1から100まで数える)
- 単純な集計や走査(例: 配列の合計、平均)
- 深さが浅い処理(ネストがない or 1段階だけ)
まとめ
- ループの方が読みやすい場面
- 回数が決まっている繰り返し
- 単純な処理(合計、カウント、表示など)
- 再帰の方が読みやすい場面
- 深さが不明な入れ子構造(フォルダ、ツリー、ネスト配列)
- 問題を「同じ形に分割」できる処理(探索、分割統治アルゴリズム)
👉 ここまでで「再帰の得意・不得意」が見えてきました。
