質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

733閲覧

pythonでハノイの塔

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2018/06/01 10:50

プログラミング初心者であるため、質問の仕方、書き方が不正確なことをお許しください。
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)
だったならわかるのですが,
実際にはどちらでも動くようです。

どこで理解を間違えているのでしょうか。
ご教授くださいませ。

また現在このレベルのアルゴリズムも解けずに困ってしまっていますので、なにか練習になるような書籍があれば教えてくださらないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アルゴリズムどうこうを考える前に、使うメソッドの仕様をしっかり確認することが大切です。

list.pop([i])
リスト中の指定された位置にある要素をリストから削除して、その要素を返します。インデクスが指定されなければ、 a.pop() はリストの末尾の要素を削除して返します。この場合も要素は削除されます。 (メソッドの用法 (signature) で i の両側にある角括弧は、この引数がオプションであることを表しているだけなので、角括弧を入力する必要はありません。この表記法は Python Library Reference の中で頻繁に見ることになるでしょう。)

5. データ構造 — Python 3.6.5 ドキュメント

list.pop()の返り値は「削ったもの」です。

具体例を。

python

1>>> lst = [1,2,3] 2>>> lst.pop(0) 31 4>>> lst 5[2, 3]

投稿2018/06/01 10:58

編集2018/06/01 11:00
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/06/01 14:09

いや、アルゴリズム考える前にってことはないでしょうよ。 メソッドはアルゴリズムを実現するための手段なのですから。
hayataka2049

2018/06/01 14:18

今回は「答えのコードは手に入ったけど何をやっているのか理解できない」、という趣旨の質問でしたので、「どんな手段を使っているのか理解しないとアルゴリズムの全体像なんか見えませんね」という回答を書きました。 あと、「メソッドはアルゴリズムを実現するための手段」というのは、もちろん正しいです。ただ、現実問題としては、「どんな手段があるか」の知識の如何でアルゴリズムの発想は制約されてしまうと個人的には考えます。なので「アルゴリズム考える前に」が『ない』とは別に思いません。 いささか乱暴な書き方たったことは認めます。
ozwk

2018/06/01 14:18

今回の質問では、コードからどういうアルゴリズムかを推定しようとしているのですから、これでいいのではないでしょうか
swordone

2018/06/01 14:31

ありゃ、失礼しました。
退会済みユーザー

退会済みユーザー

2018/06/04 08:34

回答ありがとうございます。確認不足だったようで、お手を煩わせました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問