Subject: 再帰 3 From: c116023@h.koeki-u.ac.jp To: ruby-2-06@e.koeki-u.ac.jp Date: Mon, 13 Nov 2017 18:11:28 +0900 (JST) X-Mailer: Mew version 6.3 on Emacs 23.3 / Mule 6.0 (HANACHIRUSATO) 氏名: IY 学籍番号: c116023 クラス: C 選択した番号 3 作成したプログラム本体 #!/usr/koeki/bin/ruby # coding: utf-8 def hanoi (n, from, to, work) if n == 1 printf("%d番の円盤を%sから%sに移動しなさい\n", n, from, to) else hanoi(n-1, from, work, to) printf("%d番の円盤を%sから%sに移動しなさい\n", n, from, to) hanoi(n-1, work, to, from) end end if ARGV[0] == nil STDERR.puts"ハノイの塔の最初の板の数を指定してください。" STDERR.puts"例: ./hanoi.rb 5" exit 0 end n = ARGV[0].to_i hanoi(n, "A", "B", "C") プログラムの説明(再帰の部分の詳説) 最初に、 hanoiメソッドの定義をしていて、()内は引数リスト。 もし枚数が1と等しかったら 引数n(枚数), from(元の棒の名前), to(ゴールの棒の名前)を使って文章を表示する。 それ以外(枚数が2枚以上あるとき) hanoiメソッドを使う。nは全ての枚数だから−1をする。次に元の棒の名前、 一時的に使用する棒の名前、ゴールの棒の名前。 一.hanoi(n-1, from, work, to)は、ハノイの塔の一番下以外全てのを動かす手 順。(寝てたらプロが勝手に一番下以外動かしておいてくれた状態。) 二.printf("%d番の円盤を%sから%sに移動しなさい\n", n, from, to)で、一番下一枚だけを動かす。(自分は一番下だけを動かしておく。また寝る) 三.hanoi(n-1, work, to, from)で、さっき動かしたやつのうえに他全部乗る。 (寝てる間にまた誰かが全部やってくれた状態。完成) 図にすると 元の状態 1 2 3 4 "A" "B" "C" "from" "to" "work" 一 1 2 4 3 "A" "B" "C" "from" "to" "work" 寝てたらプロが一番下以外動かしてくれていた。 この図だとCに1~3を動かしていてくれた。 プログラムではhanoi(n-1, from, work, to)がこの作業。 二 1 2 4 3 "A" "B" "C" "from" "to" "work" 自分は一番下をゴールのとこに置いとく。 また寝る。 この図では4をBへ。 行動おわり プログラムではprintf("%d番の円盤を%sから%sに移動しなさい\n", n, from, to)がこの作業にあたる。 三 1 2 3 4 "A" "B" "C" "from" "to" "work" またプロが一番下以外全てを動かしてくれた。ハノイの塔完成。 この図では1~3を4の上へやってくれた。 プログラムだとhanoi(n-1, work, to, from)がこれ。 もしARGVの最初の部屋がからっぽだったら、 ハノイの塔の最初の板の数を指定してください。 例: ./hanoi.rb 5 とktermで表示される。 STDERRを使うのは、メッセージを出力するため。 枚数がARGVの最初の部屋に入れられることを示している。to_iは、入力された文字を整数に変換するため。 nは枚数、ABCは棒の名前である。hanoi (n, from, to, work)とhanoi(n, "A", "B", "C")は対応していて、fromはA、toはB、workはCである。 実行結果 sime{c116023}% ./hanoi.rb 4 [~/Ruby] 1番の円盤をAからCに移動しなさい 2番の円盤をAからBに移動しなさい 1番の円盤をCからBに移動しなさい 3番の円盤をAからCに移動しなさい 1番の円盤をBからAに移動しなさい 2番の円盤をBからCに移動しなさい 1番の円盤をAからCに移動しなさい 4番の円盤をAからBに移動しなさい 1番の円盤をCからBに移動しなさい 2番の円盤をCからAに移動しなさい 1番の円盤をBからAに移動しなさい 3番の円盤をCからBに移動しなさい 1番の円盤をAからCに移動しなさい 2番の円盤をAからBに移動しなさい 1番の円盤をCからBに移動しなさい sime{c116023}% ./hanoi.rb 3 [~/Ruby] 1番の円盤をAからBに移動しなさい 2番の円盤をAからCに移動しなさい 1番の円盤をBからCに移動しなさい 3番の円盤をAからBに移動しなさい 1番の円盤をCからAに移動しなさい 2番の円盤をCからBに移動しなさい 1番の円盤をAからBに移動しなさい sime{c116023}% ./hanoi.rb 2 [~/Ruby] 1番の円盤をAからCに移動しなさい 2番の円盤をAからBに移動しなさい 1番の円盤をCからBに移動しなさい 参考文献 広瀬雄二."Rubyプログラミング基礎講座".第3版,技術評論社,2006,311p 感想 今回の講義は、受講前は「全然意味わかんないしどうしよう」と思っていま したが、講義を受けてからだと、5割くらいはわかったと思います。qsortが そんな感じでした。 今回から毎回の〆切が火曜日になっていて、嬉しいです。質問しに行きやす くなったんじゃないかなと思います。ありがとうございます。 Multipart形式で添付したRubyプログラム