それでは「ループ」と「再帰」を並べて比較してみましょう。両方で同じ処理を書いてみると、違いがすごく分かりやすくなります。
例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) |
| 再帰 | 問題を「同じ形に分割」できるとき、ネスト構造や木構造の探索 |
こうして並べると「ループと再帰は同じこともできるけど、得意分野が違う」って見えてきます。
