pythonでハノイの塔
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 320
プログラミング初心者であるため、質問の仕方、書き方が不正確なことをお許しください。
pythonでハノイの塔を解こうとしました。
再帰関数を使って一番大きな円盤を右端に持っていくところを軸にして組むのだろうということまでわかったものの、一番大きな円盤を持っていく位置が再帰するごとに入れ替わるようにする方法がわからず、ネットで答えを見てしまいました。
下のようなものです。
# coding: utf-8
def hanoi(disk_number, f, t, w, tower_dict):
if disk_number > 0:
hanoi(disk_number-1, f, w, t, tower_dict)
tower_dict[t].insert(0, tower_dict[f].pop(0))
print((tower_dict['left'], tower_dict['center'], tower_dict['right']))
hanoi(disk_number-1, w, t, f, tower_dict)
if __name__ == '__main__':
disk_number = int(input())
tower_dict = {'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)
だったならわかるのですが,
実際にはどちらでも動くようです。
どこで理解を間違えているのでしょうか。
ご教授くださいませ。
また現在このレベルのアルゴリズムも解けずに困ってしまっていますので、なにか練習になるような書籍があれば教えてくださらないでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
アルゴリズムどうこうを考える前に、使うメソッドの仕様をしっかり確認することが大切です。
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]
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2018/06/01 23:09
メソッドはアルゴリズムを実現するための手段なのですから。
2018/06/01 23:18
あと、「メソッドはアルゴリズムを実現するための手段」というのは、もちろん正しいです。ただ、現実問題としては、「どんな手段があるか」の知識の如何でアルゴリズムの発想は制約されてしまうと個人的には考えます。なので「アルゴリズム考える前に」が『ない』とは別に思いません。
いささか乱暴な書き方たったことは認めます。
2018/06/01 23:18
2018/06/01 23:31
2018/06/04 17:34