プログラミング初心者であるため、質問の仕方、書き方が不正確なことをお許しください。
pythonでハノイの塔を解こうとしました。
再帰関数を使って一番大きな円盤を右端に持っていくところを軸にして組むのだろうということまでわかったものの、一番大きな円盤を持っていく位置が再帰するごとに入れ替わるようにする方法がわからず、ネットで答えを見てしまいました。
下のようなものです。
python
1# coding: utf-8 2 3def hanoi(disk_number, f, t, w, tower_dict): 4 5 if disk_number > 0: 6 hanoi(disk_number-1, f, w, t, tower_dict) 7 tower_dict[t].insert(0, tower_dict[f].pop(0)) 8 print((tower_dict['left'], tower_dict['center'], tower_dict['right'])) 9 hanoi(disk_number-1, w, t, f, tower_dict) 10 11 12if __name__ == '__main__': 13 disk_number = int(input()) 14 tower_dict = {'left': [i for i in range(1, disk_number+1)], 'center': [], 'right': []} 15 print((tower_dict['left'], tower_dict['center'], tower_dict['right'])) 16 hanoi(disk_number, 'left', 'right', 'center', tower_dict)
これを見て再帰する関数の変数の書き方(f,t,wの順番を入れ替えて書く)は分かりました。
しかし肝心のtower_dict[t].insert(0, tower_dict[f].pop(0))
についてがよくわかりません。
例えばdisk_numberに1が代入される場合
1-1>0でないため、再帰が一度も起こらず、
tower_dict[t].insert(0, tower_dict[f].pop(0))
のみが(print以外では)処理されます。
ここでされる処理は(ここが一番あいまいですが)t=rightでf=leftだから
tower_dict[right]の0番目
にtower_dict[left]の0番目を削ったもの(即ち[])
を加えるということになり、printされるものは
[1],[],[]になってしまう気がします。
tower_dict[t].insert(0, tower_dict[f].pop(0))
と書いてあるところが
tower_dict[t].insert(0, tower_dict[f][0])
tower_dict[f].pop(0)
だったならわかるのですが,
実際にはどちらでも動くようです。
どこで理解を間違えているのでしょうか。
ご教授くださいませ。
また現在このレベルのアルゴリズムも解けずに困ってしまっていますので、なにか練習になるような書籍があれば教えてくださらないでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/01 14:09
2018/06/01 14:18
2018/06/01 14:18
2018/06/01 14:31
退会済みユーザー
2018/06/04 08:34