Slide 1

Slide 1 text

ϋτωίΤ ハノイの塔の解き方を 解説してみる @nekonenene

Slide 2

Slide 2 text

ࣗݾ঺հ ハトネコエ • Twitter : @nekonenene
 https://twitter.com/nekonenene • Github : nekonenene • ミクさんかわいい!!!!!!

Slide 3

Slide 3 text

લஔ͖ ハノイの塔とは?

Slide 4

Slide 4 text

ϋϊΠͷౝ フランスの数学者
 エドゥアール・リュカが
 考案したパズル。 より大きい円盤は上に置けない というルールを守りつつ、 1枚ずつ円盤を動かし、 すべての円盤を異なる柱へ移動

Slide 5

Slide 5 text

ϋϊΠͷౝ プログラミングの世界では、 X枚からなるハノイの塔を解く 最短手数Yを求めるプログラムが、 「再帰関数」を使う プログラミング問題の定番として あったりする。

Slide 6

Slide 6 text

けっこうむずかしい。 解答読んでもわからなかった ͚ͩͲ

Slide 7

Slide 7 text

出力→ ↑コード(Kotlin)

Slide 8

Slide 8 text

↑今回はそれを解説 なんで解けるの?!

Slide 9

Slide 9 text

小さい問題を手動で解き 法則をつかみます ·ͣ͸खಈ

Slide 10

Slide 10 text

̍ຕ൛ なお、左端の柱から右端の柱へ運ぶものとします Q

Slide 11

Slide 11 text

̍ຕ൛ なお、左端の柱から右端の柱へ運ぶものとします A 簡単ですが、実は意外と大事です

Slide 12

Slide 12 text

ϙΠϯτ ̍ ハノイの塔1枚版は ゴールへ移動させるだけ

Slide 13

Slide 13 text

̎ຕ൛ 真ん中の柱が役立ちます Q

Slide 14

Slide 14 text

̎ຕ൛ A1 真ん中の柱が役立ちます

Slide 15

Slide 15 text

̎ຕ൛ A2 真ん中の柱が役立ちます

Slide 16

Slide 16 text

̎ຕ൛ A3 真ん中の柱が役立ちます

Slide 17

Slide 17 text

̎ຕ൛ɿࣦഊ 先に右端に運んだ場合 Q

Slide 18

Slide 18 text

̎ຕ൛ɿࣦഊ 先に右端に運んだ場合 A1 一番下の円盤を真ん中にしか運べなくなる

Slide 19

Slide 19 text

ϙΠϯτ ̎ 円盤を動かしたあと その下にいた円盤の移動先は1通りだけ

Slide 20

Slide 20 text

̏ຕ൛ɿࣦഊ 成功した2枚版同様、最初に真ん中に運んでみよう Q

Slide 21

Slide 21 text

̏ຕ൛ɿࣦഊ 成功した2枚版同様、最初に真ん中に運んでみよう A1

Slide 22

Slide 22 text

̏ຕ൛ɿࣦഊ 成功した2枚版同様、最初に真ん中に運んでみよう A2

Slide 23

Slide 23 text

̏ຕ൛ɿࣦഊ 成功した2枚版同様、最初に真ん中に運んでみよう A3 一番下の円盤を真ん中にしか運べなくなる

Slide 24

Slide 24 text

Ͳ͏͔͔ͨͬͨ͠ʁ より大きな円盤は上に置けないから、 一番大きな円盤から先に目的地に運びたかった

Slide 25

Slide 25 text

͜ͷܗ͸࣮͸ 出発地点が変わったハノイの塔2枚版 出発地 ゴール

Slide 26

Slide 26 text

ϙΠϯτ ̏ ハノイの塔3枚版を解く過程で ハノイの塔2枚版を解く

Slide 27

Slide 27 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる Q 出発地 ゴール

Slide 28

Slide 28 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる A1 出発地 ゴール

Slide 29

Slide 29 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる A2 出発地 ゴール 3枚版の形に

Slide 30

Slide 30 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる A3 出発地 ゴール

Slide 31

Slide 31 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる A4 出発地 ゴール 2枚版の形に

Slide 32

Slide 32 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる A5 出発地 ゴール

Slide 33

Slide 33 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる A6 出発地 ゴール 1枚版の形に

Slide 34

Slide 34 text

̐ຕ൛΋ಉ༷ 「どんな形にしたいか」で考えてみる A7 出発地 ゴール 1枚版は
 ゴールに
 円盤を
 動かすだけ

Slide 35

Slide 35 text

ϙΠϯτ ̐ 出発地点を変えつつ 1枚少ない版のハノイの塔を解く イメージ

Slide 36

Slide 36 text

ϙΠϯτ·ͱΊ • X枚版のハノイの塔は、
 出発地点の異なるX-1枚版のハノイの塔を
 解決することで攻略できる • ハノイの塔1枚版は
 ゴールへ移動させるだけ • 最短手数を求めるとき、
 より大きな円盤の移動手段が限定されること、
 X-1枚版のハノイの塔を攻略することから
 1通りの動かし方しかないとわかる

Slide 37

Slide 37 text

これらを踏まえて コードを改めて読んでみよう ίʔυಡΈ

Slide 38

Slide 38 text

େ·͔ͳྲྀΕ 出発地 ゴール ハノイの塔4枚版で見る 大まかな流れ

Slide 39

Slide 39 text

େ·͔ͳྲྀΕ 出発地 ゴール 出発地 ゴール 上3枚を移動させ 最下段の1枚を 移動する旨プリント

Slide 40

Slide 40 text

େ·͔ͳྲྀΕ 出発地 ゴール 出発地を変え ハノイの塔3枚版を 解き始める

Slide 41

Slide 41 text

出発地 ゴール ̎ຕ൛ͰͷྲྀΕ(1) ハノイの塔2枚版で 実際の流れを 追ってみよう!

Slide 42

Slide 42 text

̎ຕ൛ͰͷྲྀΕ(2) 関数呼び出しで、 左図のハノイの塔を 解くように指示 出発地 ゴール

Slide 43

Slide 43 text

̎ຕ൛ͰͷྲྀΕ(3) 呼び出された側は
 discNumber = 1 だから、 println の行だけ実行
 「1をAからBへ」 と出力 出発地 ゴール

Slide 44

Slide 44 text

出発地 ゴール ̎ຕ൛ͰͷྲྀΕ(4) 関数呼び出しが終わり、 呼び出し元も println 行の処理 「2をAからCへ」 と出力

Slide 45

Slide 45 text

̎ຕ൛ͰͷྲྀΕ(5) 関数呼び出しで、 左図のハノイの塔を 解くように指示 出発地 ゴール

Slide 46

Slide 46 text

̎ຕ൛ͰͷྲྀΕ(6) 呼び出された側は
 discNumber = 1 だから、 println の行だけ実行
 「1をBからCへ」 と出力 出発地 ゴール

Slide 47

Slide 47 text

出発地 ゴール ̎ຕ൛ͰͷྲྀΕ(7) 関数呼び出しが終わり、 処理終了。 3枚版, 4枚版も、 規模は大きいが根本的には同様

Slide 48

Slide 48 text

·ͱΊ どうして解けるか わかったけど難しい!!

Slide 49

Slide 49 text

Thanks 解答コードの参考 • ハノイの塔を攻略せよ!【Windowsプログラミング研究 所】
 http://www13.plala.or.jp/kymats/study/C++/Hanoi/ Hanoi.html こういう易しいテーマでかまいません、 ぜひ皆様ご登壇ください