Keito

© 2024 Keito

技術ブログとポートフォリオ

階乗の計算(再帰)

線形再帰構造で再帰アルゴリズムの基本概念を学ぼう

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) 空間
  • • スタックオーバーフローが発生しない
  • • 実行速度が若干高速
  • • 実用的なアプリケーションで推奨
  • • 教育的価値は再帰実装の方が高い