アルゴリズムとデータ構造 補足資料9-1 「ハノイの塔」

Slides:



Advertisements
Similar presentations
データベース. レシートを見てみよう コンビニやスーパーで買物をするときの レシートを見てみよう – 何がかいてあるだろうか? – レジで全部打ち込んでいる? – なぜ、打ち込まないのにレシートには商品名 や価格が出てくるの?
Advertisements

ハノイグラフの生成と最短経路の導出 東京電機大学 理工学部 村田和也 松浦昭洋
ハノイの塔 1年9組 馬部 由美絵.
-OHBYカードを素材とした演習- カードの演習と職業理解 大学等でのキャリア教育プログラム(活用案) 2コマ分
福岡大学工学部 電子情報工学科 助教:高橋 伸弥
数当てゲーム (「誤り訂正符号」に関連した話題)
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
アルゴリズムと データ構造 第9回 再帰的アルゴリズム.
アルゴリズムとデータ構造1 2005年7月8日
独自ルールを用いた “ハノイの塔”の拡張 立命館高校 3年9組 馬部 由美絵.
一次関数と方程式 本時の流れ ねらい「二元一次方程式をグラフに表すことができる。」 ↓ 課題の提示 yについて解き、グラフをかく
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
プログラミング論 I 関数の再帰呼び出し
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
第10回 ソート(1):単純なソートアルゴリズム
スーパー・シェイプ・ショット Super Shape Shot ゲームをつくろう <説明と進行>
第2回 内容 ハノイの塔―無向グラフと有向グラフ 教科書の 1.3 節 pp.7-12 参照
パスワードをつけよう! ~ワード・エクセル・一太郎 ・その他(アタッシェケース)~
5年  面積.
情報処理Ⅱ 2005年12月9日(金).
アルゴリズムとデータ構造 補足資料7-3 「単純選択ソートselsort.c」
アルゴリズムとデータ構造 補足資料4-2 「線形探索」
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
Stack & Queue & List 3.
アルゴリズムとデータ構造 補足資料10-2 「nクイーン」
-OHBYカードを素材とした演習- カードの演習と職業理解 大学等でのキャリア教育プログラム(活用案) 2コマ分
プログラミング論 I 2008年07月03日 2008年07月10日 2008年7月11日 関数,再帰
「三角形の面積の変化の様子を一次関数としてとらえることができる。」
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング2 関数の再帰呼び出し
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
アルゴリズムとデータ構造 補足資料10-1 「騎士巡回」
2011/06/21-24 情報知能学科「アルゴリズムとデータ構造」 担当:白井英俊
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料4-1 「メモリと配列」
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
アルゴリズムとデータ構造 補足資料6-2 「サンプルプログラムcat2.c」
 情報の授業 アルゴリズムとプログラム(1) Go.Ota.
データ構造とアルゴリズム論 第7章 再帰処理 平成17年12月6日 森田 彦.
アルゴリズムとプログラミング (Algorithms and Programming)
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラミング 4 整列アルゴリズム.
「おかたづけの大切さを知ろう」 ダスキンお片付け教育カリキュラム.
アルゴリズムとデータ構造 2010年7月26日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
情報とコンピュータ 静岡大学工学部 安藤和敏
2011年度 情報科学&情報科学演習 ~ 定番プログラム(2) ~.
1~15までの数字の中から、 1個の数字を選び、覚えて下さい。
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 2011年6月23日
プログラミング論 I 2008年07月03日 関数,再帰
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2008年7月24日
執筆者:難波和明 授業者:寺尾 敦 atsushi [at] si.aoyama.ac.jp
アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」
1~15までの数字の中から、 1個の数字を選び、覚えて下さい。
アルゴリズム入門 (Ver /10/07) ・フローチャートとプログラムの基本構造 ・リスト ・合計の計算
オブジェクト指向 プログラミング 第四回 知能情報学部 新田直也.
アルゴリズムとデータ構造 補足資料7-1 「メモリでの『構造体の配列』」
アルゴリズムとデータ構造 補足資料6-1 「サンプルプログラムcat1.c」
アルゴリズムとデータ構造 補足資料5-3 「サンプルプログラムstrcat.c」
プログラミング2 関数の再帰呼び出し
オートマトンって? (Turing machine).
効率の良いとんぼのかけ方 文教大学 情報学部 経営情報学科 4年 99P21104 服部 洋一郎.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
探究科スライド 教材No.12.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
Presentation transcript:

アルゴリズムとデータ構造 補足資料9-1 「ハノイの塔」 横浜国立大学 理工学部 数物・電子情報系学科 富井尚志

ハノイの塔

ハノイの塔 条件1:一度に一枚の円盤だけが移動できる。 条件2:どの円盤もその円盤より小さい円盤の上においてはいけない。 条件3:棒Cを補助的な場所として良い。

ハノイの塔:実際にやってみよう (準備) A4の紙を配ります。 (裏紙:再利用紙です。裏側の白い面を使います。)  (裏紙:再利用紙です。裏側の白い面を使います。) まず、半分に切ってください。 できた2枚のうち、一枚をまた半分に切ってください。 5回くらいでいいです。。。 これも再帰的。。。

ハノイの塔:実際にやってみよう (準備) 半分に切る

ハノイの塔:実際にやってみよう (準備)

5 ハノイの塔:実際にやってみよう (準備) 4 3 2 番号をかいて、 四隅にしるしをつけよう。 ● 4 × 3 ● 2 × 1 ・ 番号をかいて、 四隅にしるしをつけよう。 (奇数のカードの四隅には●、偶数のカードの四隅には×) これは使いません。→

ハノイの塔:実際にやってみよう (準備) 5 ● 4 × 3 ● 2 × 1 ・ 順番に重ねる。

ハノイの塔:実際にやってみよう (準備) 5 ● 4 × 3 ● 2 × 1 ・ 順番に重ねる。 (四隅のしるしが見えるように)

5 ハノイの塔:実際にやってみよう (準備) 4 3 円盤→カード 棒→領域 棒(領域)A 棒(領域)B 棒(領域)C 2 ● 1 × ● ・ 円盤→カード 棒→領域

5 ハノイの塔:実際にやってみよう (準備) 4 3 棒(領域)A 棒(領域)B 棒(領域)C 一度に、一番上の1枚だけ移動できる ● スタート 4 × 3 ● 2 × 1 ・ 一度に、一番上の1枚だけ移動できる どのカードも、そのカードより小さいカードの  上においてはいけない 領域Cを補助的な場所として使用してよい 最終的に、カードの束を、領域Aから領域Bに移動させる

5 ハノイの塔:実際にやってみよう (準備) 4 3 棒(領域)A 棒(領域)B 棒(領域)C 一度に、一番上の1枚だけ移動できる ● ゴール 4 × 3 ● 2 × 1 ・ 一度に、一番上の1枚だけ移動できる どのカードも、そのカードより小さいカードの  上においてはいけない 領域Cを補助的な場所として使用してよい 最終的に、カードの束を、領域Aから領域Bに移動させる

ハノイの塔:実際にやってみよう (まずは2枚から) 棒(領域)A 棒(領域)B 棒(領域)C 2 × 1 ・ 一度に、一番上の1枚だけ移動できる どのカードも、そのカードより小さいカードの  上においてはいけない 領域Cを補助的な場所として使用してよい 最終的に、カードの束を、領域Aから領域Bに移動させる

ハノイの塔:実際にやってみよう (まずは2枚から) 棒(領域)A 棒(領域)B 棒(領域)C スタート 2 × 1 ・ 一度に、一番上の1枚だけ移動できる どのカードも、そのカードより小さいカードの  上においてはいけない 領域Cを補助的な場所として使用してよい 最終的に、カードの束を、領域Aから領域Bに移動させる

ハノイの塔:実際にやってみよう (まずは2枚から) 棒(領域)A 棒(領域)B 棒(領域)C AからCへ 移動 2をBに移動させ るにまず、 その上の1を Cに移動させる 2 × 1 ・ 一度に、一番上の1枚だけ移動できる どのカードも、そのカードより小さいカードの  上においてはいけない 領域Cを補助的な場所として使用してよい 最終的に、カードの束を、領域Aから領域Bに移動させる

ハノイの塔:実際にやってみよう (まずは2枚から) 棒(領域)A 棒(領域)B 棒(領域)C AからBへ 移動 一番下の2を Bに移動させた 2 × 1 ・ 一度に、一番上の1枚だけ移動できる どのカードも、そのカードより小さいカードの  上においてはいけない 領域Cを補助的な場所として使用してよい 最終的に、カードの束を、領域Aから領域Bに移動させる

ハノイの塔:実際にやってみよう (まずは2枚から) 棒(領域)A 棒(領域)B 棒(領域)C CからAへ 移動 Cに退避して いた1を Bに移動させた ゴール! 2 × 1 ・ 一度に、一番上の1枚だけ移動できる どのカードも、そのカードより小さいカードの  上においてはいけない 領域Cを補助的な場所として使用してよい 最終的に、カードの束を、領域Aから領域Bに移動させる

ハノイの塔:実際にやってみよう (つぎは3枚) 棒(領域)A 棒(領域)B 棒(領域)C 3 ● 2 × 1 ・ 実際にやってみよう

ハノイの塔:実際にやってみよう 4 実際にやってみよう ゴールがBかCかは あまり気にせず、4枚、5枚、、、 3 棒(領域)A 棒(領域)B × 3 ● 2 × 1 ・ 実際にやってみよう ゴールがBかCかは あまり気にせず、4枚、5枚、、、

ハノイの塔:解き方 棒(領域)A 棒(領域)B 棒(領域)C 4 × 3 ● 2 × 1 ・ この水色の山をBに動かすには

ハノイの塔:解き方 4 この水色の山をBに動かすには、 まずその上の紫を 3 棒(領域)A 棒(領域)B 棒(領域)C 2 × 1 ● × ・ この水色の山をBに動かすには、 まずその上の紫を

ハノイの塔:解き方 4 この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 3 棒(領域)A 棒(領域)B 棒(領域)C 2 × 3 ● 2 × 1 ・ この水色の山をBに動かすには、 まずその上の紫をCに「移動」して

ハノイの塔:解き方 4 この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし 3 棒(領域)A 棒(領域)B × 3 ● 2 × 1 ・ この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし

ハノイの塔:解き方 4 この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし Cに退避した部分をBに「移動」 棒(領域)A 棒(領域)B 棒(領域)C 4 × 3 ● 2 × 1 ・ この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし Cに退避した部分をBに「移動」

ハノイの塔:プログラム 4 この水色の山をBに動かすには hanoi( 4, “棒A”, “棒B”, “棒C”) 3 棒(領域)A × 3 ● 2 × 1 ・ この水色の山をBに動かすには hanoi( 4, “棒A”, “棒B”, “棒C”)

ハノイの塔:プログラム 4 この水色の山をBに動かすには、 まずその上の紫を hanoi( 3, “棒A”, “棒C”, “棒B”) 3 棒(領域)A 棒(領域)B 棒(領域)C 4 × 3 ● 2 × 1 ・ この水色の山をBに動かすには、 まずその上の紫を hanoi( 3, “棒A”, “棒C”, “棒B”)

ハノイの塔:プログラム 4 この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 棒(領域)A 棒(領域)B 棒(領域)C 4 × 3 ● 2 × 1 ・ この水色の山をBに動かすには、 まずその上の紫をCに「移動」して hanoi( 3, “棒A”, “棒C”, “棒B”);

ハノイの塔:プログラム 4 この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし 棒(領域)A 棒(領域)B 棒(領域)C 4 × 3 ● 2 × 1 ・ この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし hanoi( 3, “棒A”, “棒C”, “棒B”); move(“棒A”, “棒B”);

ハノイの塔:プログラム 4 この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし 棒(領域)A 棒(領域)B 棒(領域)C 4 × 3 ● 2 × 1 ・ この水色の山をBに動かすには、 まずその上の紫をCに「移動」して 一番下をBに動かし Cに退避した部分をBに「移動」 hanoi( 3, “棒A”, “棒C”, “棒B”); move(“棒A”, “棒B”); hanoi(3, “棒C”, “棒B”, “棒A”);

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); }

おっと、その前に ゴミは必ず、各自持ち帰ってください。

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk枚 src : “棒A” dst: “棒B” work: “棒C”

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk-1枚 ndisk枚 src : “棒A” dst: “棒B” work: “棒C”

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk-1枚 ndisk枚 src : “棒A” dst: “棒B” work: “棒C”

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk-1枚 ndisk枚 src : “棒A” dst: “棒B” work: “棒C”

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk-1枚 ndisk枚 src : “棒A” dst: “棒B” work: “棒C”

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk-1枚 ndisk枚 src : “棒A” dst: “棒B” work: “棒C”

ハノイの塔:プログラム void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk-1枚 ndisk枚 src : “棒A” dst: “棒B” work: “棒C”

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(3, “棒A”, “棒B”, “棒C”) ゴールのイメージ 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(2, “棒A”, “棒C”, “棒B”) ゴールのイメージ 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(2, “棒A”, “棒C”, “棒B”) ゴールのイメージ 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒A”, “棒B”, “棒C”) hanoi(1, “棒A”, “棒B”, “棒C”) ゴールのイメージ 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒A”, “棒B”, “棒C”) hanoi(1, “棒A”, “棒B”, “棒C”) ゴールのイメージ hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒A”, “棒B”, “棒C”) hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C hanoi(0, “棒A”, “棒C”, “棒B”) 円盤数が0なので、 何もしないで戻る 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒A”, “棒B”, “棒C”) hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒A”, “棒B”, “棒C”) move(“棒A”, “棒B”) 「棒Aから棒Bへ移動」 hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒A”, “棒B”, “棒C”) hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C 棒A 棒B 棒C hanoi(0, “棒C”, “棒B”, “棒A”) 円盤数が0なので、 何もしないで戻る

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒A”, “棒B”, “棒C”) hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) move(“棒A”, “棒C”) 「棒Aから棒Cへ移動」 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒B”, “棒C”, “棒A”) ゴールのイメージ hanoi(1, “棒B”, “棒C”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒B”, “棒C”, “棒A”) ゴールのイメージ hanoi(1, “棒B”, “棒C”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 1 src 棒B work 棒A hanoi(1, “棒B”, “棒C”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒B”, “棒C”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 1 src 棒B work 棒A hanoi(1, “棒B”, “棒C”, “棒A”) hanoi(0, “棒B”, “棒A”, “棒C”) 円盤数が0なので、 何もしないで戻る 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) move(“棒B”, “棒C”) 「棒Bから棒Cへ移動」 hanoi(1, “棒B”, “棒C”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 1 src 棒B work 棒A hanoi(1, “棒B”, “棒C”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒B”, “棒C”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 1 src 棒B work 棒A hanoi(1, “棒B”, “棒C”, “棒A”) 棒A 棒B 棒C hanoi(0, “棒A”, “棒C”, “棒B”) 円盤数が0なので、 何もしないで戻る

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) hanoi(1, “棒B”, “棒C”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 1 src 棒B work 棒A hanoi(1, “棒B”, “棒C”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒A”, “棒C”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒C を使って 移動 2 src 棒A work 棒B hanoi(2, “棒A”, “棒C”, “棒B”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C move(“棒A”, “棒B”) 「棒Aから棒Bへ移動」 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(2, “棒C”, “棒B”, “棒A”) ゴールのイメージ 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(2, “棒C”, “棒B”, “棒A”) ゴールのイメージ 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒C”, “棒A”, “棒B”) hanoi(1, “棒C”, “棒A”, “棒B”) ゴールのイメージ 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒C”, “棒A”, “棒B”) hanoi(1, “棒C”, “棒A”, “棒B”) ゴールのイメージ hanoi(1, “棒C”, “棒A”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒A を使って 移動 1 src 棒C work 棒B 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒C”, “棒A”, “棒B”) hanoi(1, “棒C”, “棒A”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒A を使って 移動 1 src 棒C work 棒B hanoi(0, “棒C”, “棒B”, “棒A”) 円盤数が0なので、 何もしないで戻る 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒C”, “棒A”, “棒B”) move(“棒C”, “棒A”) 「棒Cから棒Aへ移動」 hanoi(1, “棒C”, “棒A”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒A を使って 移動 1 src 棒C work 棒B 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒C”, “棒A”, “棒B”) hanoi(1, “棒C”, “棒A”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒A を使って 移動 1 src 棒C work 棒B 棒A 棒B 棒C hanoi(0, “棒B”, “棒A”, “棒C”) 円盤数が0なので、 何もしないで戻る

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒C”, “棒A”, “棒B”) hanoi(1, “棒C”, “棒A”, “棒B”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒A を使って 移動 1 src 棒C work 棒B 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) move(“棒C”, “棒B”) 「棒Cから棒Bへ移動」 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒A”, “棒B”, “棒C”) ゴールのイメージ hanoi(1, “棒A”, “棒B”, “棒C”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒A”, “棒B”, “棒C”) ゴールのイメージ hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C hanoi(1, “棒A”, “棒B”, “棒C”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C hanoi(1, “棒A”, “棒B”, “棒C”) hanoi(0, “棒A”, “棒C”, “棒B”) 円盤数が0なので、 何もしないで戻る 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) move(“棒A”, “棒B”) 「棒Aから棒Bへ移動」 hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C hanoi(1, “棒A”, “棒B”, “棒C”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C hanoi(1, “棒A”, “棒B”, “棒C”) 棒A 棒B 棒C hanoi(0, “棒C”, “棒B”, “棒A”) 円盤数が0なので、 何もしないで戻る

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) hanoi(1, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 1 src 棒A work 棒C hanoi(1, “棒A”, “棒B”, “棒C”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C hanoi(2, “棒C”, “棒B”, “棒A”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 2 src 棒C work 棒A hanoi(2, “棒C”, “棒B”, “棒A”) 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C 棒A 棒B 棒C

ハノイの塔:実行の様子 if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); hanoi(3, “棒A”, “棒B”, “棒C”) if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } ndisk から 枚の円盤を へ dst 棒B を使って 移動 3 src 棒A work 棒C 完了:呼び出し元(main関数)に戻る 棒A 棒B 棒C

ハノイの塔:移動回数 void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); move(src, dst); hanoi(ndisk-1, work, dst, src); } hanoi(n, , , )の移動回数(n枚の円盤全体を移動させるのに必要な移動回数):mnと置く

ハノイの塔:移動回数 void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); mn-1回の移動 move(src, dst);          1回の移動 hanoi(ndisk-1, work, dst, src ); mn-1回の移動 } hanoi(n, , , )の移動回数(n枚の円盤全体を移動させるのに必要な移動回数):mnと置く

ハノイの塔:移動回数 void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); mn-1回の移動 move(src, dst);          1回の移動 hanoi(ndisk-1, work, dst, src ); mn-1回の移動 } hanoi(n, , , )の移動回数(n枚の円盤全体を移動させるのに必要な移動回数):mnと置く、と、 mn = 2 x mn-1 +1

ハノイの塔:移動回数 void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); mn-1回の移動 move(src, dst);          1回の移動 hanoi(ndisk-1, work, dst, src ); mn-1回の移動 } hanoi(n, , , )の移動回数(n枚の円盤全体を移動させるのに必要な移動回数):mnと置く、と、 mn = 2n-1

ハノイの塔:移動回数 O(2n) void hanoi(int ndisk, char *src, char *dst, char *work) { if(ndisk>=1){ hanoi(ndisk-1, src, work, dst); mn-1回の移動 move(src, dst);          1回の移動 hanoi(ndisk-1, work, dst, src ); mn-1回の移動 } hanoi(n, , , )の移動回数(n枚の円盤全体を移動させるのに必要な移動回数):mnと置く、と、 mn = 2n-1

ハノイの塔:移動回数 O(2n) n 2n-1 2 3 7 4 15 8 255 16 65,535 32 4,294,967,295 64 およそ1019 100 およそ1030 1,000 およそ10300 hanoi(n, , , )の移動回数(n枚の円盤全体を移動させるのに必要な移動回数):mnと置く、と、 mn = 2n-1

O(2n) mn = 2n-1 ハノイの塔:移動回数 円盤を目にもとまらぬ早業(1秒間に100億回) で移動させたら… n 2n-1 2 3 x 10-10秒: 0.3ナノ秒 3 7 x 10-10秒: 0.7ナノ秒 4 15 x 10-10秒: 1.5ナノ秒 8 255 x 10-10秒: 26ナノ秒 16 65,535 x 10-10秒: 6.6マイクロ秒 32 4,294,967,295 x 10-10秒: 0.4秒 64 およそ109秒:およそ57年 100 およそ1020秒:およそ1兆年:宇宙の歴史100回分 1,000 およそ10290秒:およそ10282年:宇宙の歴史10272回分 円盤を目にもとまらぬ早業(1秒間に100億回) で移動させたら… mn = 2n-1