質問: {'left': [i for i in range(1, disk_number+1)], 'center': [], 'right': []} print((tower_dict['left'], tower_dict['center'], tower_dict['right'])) 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) だったならわかるのですが, 実際にはどちらでも動くようです。 どこで理解を間違えているのでしょうか。 ご教授くださいませ。 また現在このレベルのアルゴリズムも解けずに困ってしまっていますので、なにか練習になるような書籍があれば教えてくださらないでしょうか?
回答: アルゴリズムどうこうを考える前に、使うメソッドの仕様をしっかり確認することが大切です。 > > list.pop([i]) > > リスト中の指定された位置にある要素をリストから削除して、その要素を返します。インデクスが指定されなければ、 a.pop() はリストの末尾の要素を削除して返します。この場合も要素は削除されます。 (メソッドの用法 (signature) で i の両側にある角括弧は、この引数がオプションであることを表しているだけなので、角括弧を入力する必要はありません。この表記法は Python Library Reference の中で頻繁に見ることになるでしょう。) > > 5. データ構造 — Python 3.6.5 ドキュメント > > > `list.pop()`の返り値は「削ったもの」です。 具体例を。 ``` >>> lst = [1,2,3] >>> lst.pop(0) 1 >>> lst [2, 3] ```