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

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

ただいまの
回答率

90.61%

  • Python 3.x

    5877questions

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

  • アルゴリズム

    392questions

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

pythonでハノイの塔

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 201

プログラミング初心者であるため、質問の仕方、書き方が不正確なことをお許しください。
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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

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

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5877questions

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

  • アルゴリズム

    392questions

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