ハノイの塔と再帰・指数爆発
3本の柱と円盤パズル。再帰的思考と2ⁿ-1手の爆発的宇宙を解き明かす
- 1
- 3本の柱があり、「1回に1枚しか動かせない」「小さい円盤の上に大きい円盤を乗せてはならない」ルールで全てを目的地に移す。
- 2
- 円盤 n 枚を移動させる最小手数は 手である。
- 3
- 円盤が64枚ある伝説のハノイの塔では、最小手数でも約1844京回()の手数を要し、1秒に1手動かしても完了まで約5800億年(宇宙の年齢の40倍以上)かかる。
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
1883年にフランスの数学者エドゥアール・リュカが考案したパズル。「n枚の円盤を動かすには、まず上のn-1枚を一時退避させ、一番下の1枚を動かし、退避させたn-1枚をその上に重ねる」という再帰(Recursion)の概念を視覚的に理解する最高峰の教材です。
身につく武器・思考力
プログラミングやアルゴリズムで最も重要な「分割統治法(Divide and Conquer)」と再帰的思考力、および指数関数($2^n$)の爆発的な増大スケール感覚が身につきます。
実社会・ITでの活躍現場
- •プログラミング言語のコールスタック構造と再帰アルゴリズム設計
- •ファイルのバックアップ世代管理(Grandfather-Father-Son スケジューリング)
- •数学的帰納法を用いたアルゴリズムの正当性証明
Layer 1 — 直感・シミュレーター
柱をクリックして一番上の円盤を選択し、移動先の柱をクリックして運んでください。円盤の枚数(3枚、4枚、5枚)を切り替えて、手数が指数関数的に増えていく感覚をパズルとして楽しめます。
すべての円盤を一番右の柱へ移せ。最小手数は 2ⁿ - 1 手!
円盤が「5枚」のハノイの塔を最短の手数でクリアする場合、必要な手数は何手でしょうか?
Layer 2 — 定義・受験・証明
定義
円盤の枚数を としたとき、 枚のハノイの塔を解く最小手数 は、漸化式 で定義される数列です。
公式・数理モデル
証明・導出
最大の円盤を柱Aから柱Cへ移動させるためには、その上にある 枚の円盤がすべて補助柱Bに移動していなければなりません(手数 )。次に最大円盤を1手で柱Cへ移動させ(1手)、最後に補助柱Bにある 枚を柱Cへ移動させます(手数 )。したがって 。両辺に 1 を加えると となり、数列 は初項 、公比 2 の等比数列となるため、 が導かれます。
押さえておきたいポイント
- 最小手数は 手(3枚:7手, 4枚:15手, 5枚:31手, 10枚:1023手)
- 分割統治法(問題を同じ構造の小さな部分問題に分割する)の典型例
- ハノイの塔の状態遷移グラフはシェルピンスキーのガスケット(フラクタル構造)を描く
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
再帰呼び出しによるハノイの塔自動ソルバー
最小手数でハノイの塔を解く手順(どの柱からどの柱へ動かすか)をすべて標準出力・配列化するTypeScriptの再帰関数です。
1export interface MoveStep {2 disk: number;3 from: string;4 to: string;5}67export function solveHanoi(8 n: number,9 fromPeg: string = "A",10 toPeg: string = "C",11 auxPeg: string = "B"12): MoveStep[] {13 const steps: MoveStep[] = [];1415 function move(disk: number, from: string, to: string, aux: string) {16 if (disk === 1) {17 steps.push({ disk: 1, from, to });18 return;19 }20 // 1. 上の disk - 1 枚を補助柱へ退避21 move(disk - 1, from, aux, to);22 // 2. 最底の円盤を目的地へ移動23 steps.push({ disk, from, to });24 // 3. 補助柱の disk - 1 枚を目的地へ重ねる25 move(disk - 1, aux, to, from);26 }2728 move(n, fromPeg, toPeg, auxPeg);29 return steps;30}3132// 実行例:33// const solution = solveHanoi(3);34// console.log(`総手数: ${solution.length}手`); // 7手
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元