Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ハノイの塔問題の解法をできるだけわかりやすく解説

 ハノイの塔問題の解法をできるだけわかりやすく解説

再帰関数を使うプログラミング問題としても有名なハノイの塔をなるべくわかりやすいよう解説
https://twitter.com/nekonenene

ハトネコエ

March 29, 2017
Tweet

More Decks by ハトネコエ

Other Decks in Technology

Transcript

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

    View full-size slide

  2. ࣗݾ঺հ
    ハトネコエ
    • Twitter : @nekonenene

    https://twitter.com/nekonenene
    • Github : nekonenene
    • ミクさんかわいい!!!!!!

    View full-size slide

  3. લஔ͖
    ハノイの塔とは?

    View full-size slide

  4. ϋϊΠͷౝ
    フランスの数学者

    エドゥアール・リュカが

    考案したパズル。
    より大きい円盤は上に置けない
    というルールを守りつつ、
    1枚ずつ円盤を動かし、
    すべての円盤を異なる柱へ移動

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. 出力→
    ↑コード(Kotlin)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    ゴールに

    円盤を

    動かすだけ

    View full-size slide

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

    View full-size slide

  36. ϙΠϯτ·ͱΊ
    • X枚版のハノイの塔は、

    出発地点の異なるX-1枚版のハノイの塔を

    解決することで攻略できる
    • ハノイの塔1枚版は

    ゴールへ移動させるだけ
    • 最短手数を求めるとき、

    より大きな円盤の移動手段が限定されること、

    X-1枚版のハノイの塔を攻略することから

    1通りの動かし方しかないとわかる

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  43. ̎ຕ൛ͰͷྲྀΕ(3)
    呼び出された側は

    discNumber = 1 だから、
    println の行だけ実行

    「1をAからBへ」
    と出力
    出発地 ゴール

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  46. ̎ຕ൛ͰͷྲྀΕ(6)
    呼び出された側は

    discNumber = 1 だから、
    println の行だけ実行

    「1をBからCへ」
    と出力
    出発地 ゴール

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  49. Thanks
    解答コードの参考
    • ハノイの塔を攻略せよ!【Windowsプログラミング研究
    所】

    http://www13.plala.or.jp/kymats/study/C++/Hanoi/
    Hanoi.html
    こういう易しいテーマでかまいません、
    ぜひ皆様ご登壇ください

    View full-size slide