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

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

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

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

959960084f2086d7a875a30d2a428682?s=128

ハトネコエ

March 29, 2017
Tweet

More Decks by ハトネコエ

Other Decks in Technology

Transcript

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

  2. ࣗݾ঺հ ハトネコエ • Twitter : @nekonenene
 https://twitter.com/nekonenene • Github :

    nekonenene • ミクさんかわいい!!!!!!
  3. લஔ͖ ハノイの塔とは?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  36. ϙΠϯτ·ͱΊ • X枚版のハノイの塔は、
 出発地点の異なるX-1枚版のハノイの塔を
 解決することで攻略できる • ハノイの塔1枚版は
 ゴールへ移動させるだけ • 最短手数を求めるとき、


    より大きな円盤の移動手段が限定されること、
 X-1枚版のハノイの塔を攻略することから
 1通りの動かし方しかないとわかる
  37. これらを踏まえて コードを改めて読んでみよう ίʔυಡΈ

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

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

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

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

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

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

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

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

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

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

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

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