ハノイの塔を実装してみる

19
ハノイ ハノイ ハノイ ハノイの の塔 塔を 実装 実装 実装 実装してみる してみる してみる してみる

Upload: hiromu-shioya

Post on 24-May-2015

1.678 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ハノイの塔を実装してみる

����������������������������������������������������������������������������

����������

�������� ��

ハノイハノイハノイハノイのののの塔塔塔塔をををを実装実装実装実装してみるしてみるしてみるしてみる

Page 2: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

自己紹介

• ������

– プログラマ• �������������������

– 東京�� ��� �������勉強会 主宰• �������� ��������������

• 趣味

– 料理

– 電子工作

Page 3: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

アジェンダ

• ハノイの塔とは?

• プログラミングを学ぶ上での意味

• 実装例の紹介

Page 4: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

ハノイの塔とは?

Page 5: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

ハノイの塔とは?

• こんなの

• #$%&年発売のゲーム

– エドゥアール・リュカ• フランスの数学者

• 勝手に伝説を作る

– ガンジス河畔で僧侶が67ハノイを解いている。解き終わったら世界は崩壊し終焉を迎える。

Page 6: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

ルール

• 1回に1枚ずつしか動かせない

• 自分より大きな円盤を上に乗せることはできない

• 最初と同じ状態をゴールの杭に再現すれば完了

Page 7: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

��ハノイ…だと?

そりゃ世界も終わるよねなぜかはのちほど

Page 8: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

プログラミングを

学ぶ上での

意味

Page 9: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

なんか聞いたこと…あるよね?

• 再帰呼び出しの例題として有名

• そのほかの有名な例題

– 階乗計算• ������������� ���!���"���"!#

– フィボナッチ数列• $��� ��$� %�$���

– ユークリッドの互除法• 2つの自然数の最大公約数を求める

Page 10: ハノイの塔を実装してみる

����������������������������������������������������������������������������

再帰呼び出し

• defghijkelf�mm

• 関数が自分自身を呼び出す

– 変数のスコープに注意が必要• 関数より外なのか、中なのか

– 一時変数などはスタックに確保• あふれると異常終了する

• 再帰的アルゴリズムを実装するのに最適

Page 11: ハノイの塔を実装してみる

���������������������������������������������������������������������������� �

ハノイの塔の解法

• 円盤w個のハノイの塔を解くには– 杭をそれぞれ���� �� �とする

– �個の円盤は��に積まれている

pq ��– pハノイを何らかの方法でuvwに移動

zq �枚目の円盤をu�に移動

�q ��– pハノイを何らかの方法でu�に移動

「何らかの方法」って… (�・ω・!)

Page 12: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

+,-,.で考えてみる

pq ��– pハノイを何らかの方法でuvwに移動– �– "���# なのでなにもしない

zq �枚目の円盤をu�に移動– 円盤をKL�Mから��に移動

�q ��– pハノイを何らかの方法でu�に移動– �– "���# なのでなにもしない

できたっぽい!QR・ω・UV�

Page 13: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

実演

Page 14: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

実装例の

紹介

Page 15: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

ソースコードをご覧ください

• ポイント解説

– ハノイを解く部分:��u� u����������6�~�• 引数の配列Qスタックとして使用Vは参照渡し

• d�� e���QV が"になるまで自分自身を呼び出す

• えっと…もうないや

Page 16: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

余談:終わる世界

• 解くために必要な移動回数

→ z���– pn = 1 : 1 (回)

2 : 3

3 : 7

4 : 15

→ 64ハノイ?

"rs��tsu��s#u su#vs��"st"�

("r��京tu��兆u u億v��万"t"�)回

• 1回1秒で移動させると約��%��億年かかる

Q~ �� � ��� V

Page 17: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

まとめと感想

• ハノイの塔なんて初めて書いた

– 意外と勉強になった

• とある課題…だったんだけど不要になったのでネタにした

– �������書いた

• つい手元にある���で書いた

– ���wでさらっと書けるとカッコいいな

Page 18: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

参考文献

• ハノイの塔 – ����w���– 別の解法もあるので参照してみよう

» ������������� �������������������������������������������

�������������

• ����v���– "##種類以上の言語でハノイの塔を実装している

• #$�%&'(って!

» �������� �� ���� ���� ����� ��!�������

• 【楽天市場】:木のおもちゃ製作所・銀河工房– 写真拝借しました。

» ����������"� ����������#��$�%���&��%������

Page 19: ハノイの塔を実装してみる

���������������������������������������������������������������������������� ��

ご清聴ありがとうございました。