ハノイの塔(再帰)
分割統治法の美しい実装例で再帰的思考と指数的複雑さを学ぼう
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万回の移動が必要
🎯 実用的な応用
- • バックアップシステムの最適化
- • 並列処理でのタスク分散
- • データ構造の操作戦略
- • プロジェクト管理での依存関係解決
- • 分割統治法の教育例として最適