階乗の計算(再帰)
線形再帰構造で再帰アルゴリズムの基本概念を学ぼう
O(n)
時間計算量(線形)
O(n)
空間計算量
初級〜中級
難易度
線形再帰
手法
🔧 実行設定
計算対象:
5!
計算結果:
120
予想実行時間:
瞬時
📚 推奨値
🔢 階乗の値
0!=1, 1!=1, 2!=2, 3!=6, 4!=24, 5!=120, 6!=720, 7!=5040
🔢
アルゴリズムを実行してください
左側の設定パネルからnの値を設定し、「階乗計算実行」ボタンを押してください
💻 実装例(JavaScript)
function factorial(n) {
// ベースケース:停止条件
if (n <= 1) {
return 1;
}
// 再帰ケース:n! = n × (n-1)!
return n * factorial(n - 1);
}
// 使用例
console.log(factorial(0)); // 1
console.log(factorial(1)); // 1
console.log(factorial(5)); // 120
console.log(factorial(10)); // 3628800
// 反復版(比較用)
function factorialIterative(n) {
if (n < 0) throw new Error("負数は未対応");
let result = 1;
for (let i = 1; i <= n; i++) {
result *= i;
}
return result;
}
// 数列を生成
function generateFactorialSequence(count) {
const sequence = [];
for (let i = 0; i < count; i++) {
sequence.push(factorial(i));
}
return sequence;
}
console.log(generateFactorialSequence(6));
// [1, 1, 2, 6, 24, 120]
// 注意:この再帰実装は O(n) の時間・空間計算量
// 大きなnではスタックオーバーフローに注意
🔄 再帰 vs 反復
再帰実装の特徴
- • 数学的定義に忠実で理解しやすい
- • コードが簡潔で美しい
- • 線形時間 O(n) で実用的
- • スタック使用量 O(n)
- • 大きなnではスタックオーバーフローリスク
反復実装の特徴
- • メモリ効率が良い O(1) 空間
- • スタックオーバーフローが発生しない
- • 実行速度が若干高速
- • 実用的なアプリケーションで推奨
- • 教育的価値は再帰実装の方が高い