Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 こういう易しいテーマでかまいません、 ぜひ皆様ご登壇ください