Sign in Join
Wiki copytemporary

Basic Pascal Tutorial/Chapter 4/Programming Assignment/ja: what changed

Revision 5 to 6. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
114G - 練習問題:ハノイの塔 (著者: Tao Yue, 状態: 原文のまま変更なし)
22
33古典的な再帰問題で、すべてのコンピュータ科学コースで教えられるのはハノイの塔である。この問題では3つの垂直な棒がある。最も左の棒にはピラミッド型の塔があり、それは一連のドーナッツ型の円盤からなっている。たとえば、4階建ての塔は次のように見える。
44
5-```
5+```text
66 | | |
77 | | |
88 * | |
99 *** | |
1010 ***** | |
1111******* | |
1212```
1313
1414棒は左から右へ 1、2、3 と番号をつけられている。挑戦すべきことは塔を棒 1 から棒 3 へ移動させることである。その際に、大きい円盤はより小さい円盤の上に置いてはいけないし、1度に1つの円盤(棒の一番上の円盤)しか動かせない。
1515
1616この問題は1枚や2枚の円盤では、たいしたことはないように思えるかもしれない。1枚の円盤では棒 1 から棒 3 へ円盤を動かすだけでよい。2枚の円盤では棒 1 から棒 2 へ頂上の円盤を動かし、それから棒 1 から棒 3 へ円盤を動かし、最後に棒 2 から小さい円盤を棒 3 に動かせばよい。
1717
1818この問題は3つ以上の円盤になるとずっと難しくなる。3つの円盤では棒 1 から棒 3 に動かし、それから棒 1 から棒 2 に動かし、そして棒 3 から棒 2 に動かす。こうすると2階の塔が棒 2 に作られる。その後、最大の円盤を棒 1 から棒 3 に動かす。そうして大きな円盤の上に2階の塔を移す。すなわち、棒 2 から棒 1へ、棒 2 から棒 3 へ、棒 1 から棒 3 へ移す。
1919
2020あなたの課題はどんな数の円盤に対してもハノイの塔が解けるように再帰手続きを用いた(これは必須条件である)プログラムを書くことである。最初にユーザーにもとの塔の高さを尋ねる。それからある棒から別な棒へ個々の円盤を動かすステップごとの指示を出力する。例えば、3つの円盤の問題なら、以下のような出力が出なくてはならない。
2121
22-```
22+```text
23231 to 3
24241 to 2
25253 to 2
26261 to 3
27272 to 1
28282 to 3
29291 to 3
3030```
3131
3232再帰[[Basic Pascal Tutorial/Chapter 4/Recursion/ja|recursionのセクションで]]書いたように、再帰は理解がより難しいトピックの一つである。人によってはこの問題をみて、非常に簡単と思うかもしれない。他の人はこれと苦闘することになるだろう。しかしながら、いったん再帰を理解するというハードルを克服すると問題の実際のコーディングはかなり簡潔になる。
3333
3434だから、自分に挑戦したいなら、ここで読むのを止めるとよい。少し難しいと感じるのなら、*ヒント*を読みなさい。
3535
3636*ヒント*: 再帰の問題はすべて同様なのだが、この問題は各ステップごとを単純にすることで、問題自体を単純化できる。3つの円盤の問題を覚えているだろうか? 最初に棒 2 に2階の塔を作成した。それによって棒 1 の一番下の円盤を棒 3 に動かすことが可能になった。それから2階の塔を棒 3 の上に動かした。
3737
3838それは4つの円盤でも同じである。最初に棒 2 の上に3階の塔を作り、棒 3 に最大の円盤を移動させる。そして、3階の塔を棒 3 に移動させる。どのように3つの円盤の塔を作成しただろうか? 単純なことだ。すでに3つの円盤の塔を棒 1 から棒 3 に移動させるやり方は知っている。今度は、棒 1 から棒 2 動かし、それから最大の円盤を決まった位置においてから、塔を棒 2 から棒 3 へ動かす。この手続きで、大きい円盤は存在していないかのように扱うことができる。なぜなら、それが他のものより大きいことは確実であり、従って問題にはならないからである。数字の配置を入れ替えて、3つの円盤の解法を利用するだけでよいのである。
3939
4040Good luck!
4141
4242| | | |
4343|----|----|----|
4444| [[Basic Pascal Tutorial/Chapter 4/Forward Referencing/ja|previous]] | [[Basic Pascal Tutorial/Contents/ja|contents]] | [[Basic Pascal Tutorial/Chapter 4/Solution/ja|next]] |
4545
4646---
4747*From the Free Pascal wiki, page "Basic Pascal Tutorial/Chapter 4/Programming Assignment/ja", as it stood on 2022-08-20 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history