では「再帰を直感的に書けるけれど、ループに書き換えるとどうなるか」を比較してみましょう。これで「どちらを選ぶべきか」の感覚がさらに磨かれます。
例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👉 違い
- 再帰版は「残りを反転 + 先頭を最後に付ける」という直感的な定義。
- ループ版は「インデックスを逆順に回す」という手続き的な書き方。
✅ まとめ
- 再帰 → コードが短く直感的(特に入れ子構造や分割統治)
- ループ → 高速で安全(大量データや単純処理に強い)
👉 次のステップとしては「実際に自分で再帰をループに書き換える練習」をやってみると理解が深まります。


