Keito

© 2024 Keito

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

ハノイの塔(再帰)

分割統治法の美しい実装例で再帰的思考と指数的複雑さを学ぼう

O(2^n)
時間計算量(指数的)
O(n)
空間計算量
上級
難易度
分割統治
手法

🏗️ 実行設定

円盤の枚数:
3
予想移動回数:
7
予想実行時間:
瞬時

🎯 推奨値

📊 統計情報

移動回数: 7
関数呼び出し: 7
最大深度: 3
複雑さ: O(2^3)
🏗️

アルゴリズムを実行してください

左側の設定パネルから円盤の枚数を設定し、「ハノイの塔実行」ボタンを押してください

💻 実装例(JavaScript)

function hanoi(n, from, to, aux) {
    // ベースケース:1枚の円盤なら直接移動
    if (n === 1) {
        console.log(`円盤1を${from}から${to}に移動`);
        return;
    }
    
    // ステップ1:上のn-1枚を補助杭に移動
    hanoi(n - 1, from, aux, to);
    
    // ステップ2:最下段の円盤を目標杭に移動
    console.log(`円盤${n}を${from}から${to}に移動`);
    
    // ステップ3:補助杭のn-1枚を目標杭に移動
    hanoi(n - 1, aux, to, from);
}

// 使用例:3枚の円盤を杭Aから杭Cに移動
hanoi(3, 'A', 'C', 'B');

// 出力:
// 円盤1をAからCに移動
// 円盤2をAからBに移動
// 円盤1をCからBに移動
// 円盤3をAからCに移動
// 円盤1をBからAに移動
// 円盤2をBからCに移動
// 円盤1をAからCに移動

// 移動回数を計算する関数
function calculateMoves(n) {
    return Math.pow(2, n) - 1;
}

console.log(calculateMoves(3)); // 7
console.log(calculateMoves(10)); // 1023

// 注意:この再帰実装は O(2^n) の時間計算量
// 大きなnでは非常に時間がかかります

🎮 ハノイの塔のルールと戦略

📏 基本ルール

  • • 3本の杭(A、B、C)と n枚の円盤
  • • 全円盤を杭Aから杭Cに移動する
  • • 1回につき1枚の円盤しか移動できない
  • • 大きい円盤を小さい円盤の上に置けない
  • • 杭Bは補助的な作業スペースとして使用

🧠 分割統治戦略

  • • n枚の問題を3つのサブ問題に分解
  • • 上のn-1枚を補助杭に移動
  • • 最下段の円盤を目標杭に移動
  • • 補助杭のn-1枚を目標杭に移動
  • • 各サブ問題は再帰的に解決

🔢 数学的性質と洞察

📈 計算量の特性

  • • 最小移動回数:2^n - 1 回
  • • 時間計算量:O(2^n) - 指数的増加
  • • 空間計算量:O(n) - 再帰の深さ
  • • 円盤k の移動回数:2^(k-1) 回
  • • n=20で約100万回の移動が必要

🎯 実用的な応用

  • • バックアップシステムの最適化
  • • 並列処理でのタスク分散
  • • データ構造の操作戦略
  • • プロジェクト管理での依存関係解決
  • • 分割統治法の教育例として最適