では「階乗(factorial)」を題材にして、再帰版とループ版を並べて練習してみましょう。
階乗の定義
- ( n! = n \times (n-1) \times (n-2) \times \dots \times 1 )
- 特別に ( 0! = 1 ) と定義されます。
ループ版
function factorialLoop(n) {
let result = 1;
for (let i = n; i > 0; i--) {
result *= i;
}
return result;
}
console.log(factorialLoop(5)); // 120
JavaScript👉 変数 result を用意して、n から 1 まで掛け算していく。
シンプルで効率的。
再帰版
function factorialRec(n) {
if (n === 0) return 1; // 終了条件
return n * factorialRec(n - 1);
}
console.log(factorialRec(5)); // 120
JavaScript👉 「n! = n × (n-1)!」という定義をそのままコードにした形。
直感的で短い。
✅ 比較まとめ
| 観点 | ループ版 | 再帰版 |
|---|---|---|
| コード量 | 少し長い | 短い(定義通り) |
| 可読性 | 手続き的 | 数学的に直感的 |
| 性能 | 高速・省メモリ | 関数呼び出しの分だけ遅い |
| 安全性 | 安定 | 深すぎるとスタックオーバーフロー |
👉 ここまでで「同じ処理をループと再帰で書き分ける」練習ができました。
次の練習としては、「フィボナッチ数列」をループと再帰で書き比べると、再帰の弱点(計算の重複)と工夫(メモ化)がよく見えてきます。


