ゲームの記録を徒然に

普段の活動を書いていく雑記ブログ

Python でハノイの塔を解いたので投下

 なんかようわからんけどPythonインスコしてから7時間くらいでプログラムしたらしい。あまりにも最近更新してないので生存報告の代わりにどうぞ。

f:id:collaredZill:20190519055916p:plain

 

f:id:collaredZill:20190519055919p:plain

f:id:collaredZill:20190519055925p:plain


 軽く解説をすると33行目の move は単純に亀(ディスクかな?今回は亀)を動かすだけ、動かせたら1を返して動かせなかったら0を返すのでこれで亀を動かせたかを判別する。(いちいち調べてたらめんどいもんね)

 52行目の slove は再起関数になってて説明がしんどい。簡単に言うと、m番の亀を任意の位置に動かす関数。m番の亀が任意の位置に居たらm-1番の亀をそこの積み上げる。(58‐59行目)任意の位置に居なかった動かせるか調べて、動かせるならそこに動かす。(60行目)もし動かせなかったらm‐1番目の亀を、m番の亀でも移動させたい先でもないところに移動させるように slove 関数を再帰する。

 なんで再帰すると解けるのかっていうと、M=1の場合移動に制限がないため任意の場所に動かせる。M=2の場合、m=1の亀は任意の場所に動かせることがわかっているためm=2の亀は任意の場所に動かせる。これから数学的帰納法でMが自然数であれば解答があることがわかる。あとはどうやったら正解かわからんけど正解の形に近づくように亀を動かし続ければいつかは正解になるよね、っていうこと。

 66行目は正答の形になるか1000回試行するまで slove 関数を動かすっていうだけ。おわり。

 なんかスペルミスとかあるかもしらんけどそこらへんは動けばおkなのでてけとー。指摘は受け付けるかもしれないけどスペルミスはめんどいので直さないよ。