ハノイの塔を実装してみる
TRANSCRIPT
����������������������������������������������������������������������������
����������
�������� ��
ハノイハノイハノイハノイのののの塔塔塔塔をををを実装実装実装実装してみるしてみるしてみるしてみる
���������������������������������������������������������������������������� �
自己紹介
• ������
– プログラマ• �������������������
– 東京�� ��� �������勉強会 主宰• �������� ��������������
• 趣味
– 料理
– 電子工作
���������������������������������������������������������������������������� �
アジェンダ
• ハノイの塔とは?
• プログラミングを学ぶ上での意味
• 実装例の紹介
���������������������������������������������������������������������������� �
ハノイの塔とは?
���������������������������������������������������������������������������� �
ハノイの塔とは?
• こんなの
• #$%&年発売のゲーム
– エドゥアール・リュカ• フランスの数学者
• 勝手に伝説を作る
– ガンジス河畔で僧侶が67ハノイを解いている。解き終わったら世界は崩壊し終焉を迎える。
���������������������������������������������������������������������������� �
ルール
• 1回に1枚ずつしか動かせない
• 自分より大きな円盤を上に乗せることはできない
• 最初と同じ状態をゴールの杭に再現すれば完了
���������������������������������������������������������������������������� �
��ハノイ…だと?
そりゃ世界も終わるよねなぜかはのちほど
���������������������������������������������������������������������������� �
プログラミングを
学ぶ上での
意味
���������������������������������������������������������������������������� �
なんか聞いたこと…あるよね?
• 再帰呼び出しの例題として有名
• そのほかの有名な例題
– 階乗計算• ������������� ���!���"���"!#
– フィボナッチ数列• $��� ��$� %�$���
– ユークリッドの互除法• 2つの自然数の最大公約数を求める
����������������������������������������������������������������������������
再帰呼び出し
• defghijkelf�mm
• 関数が自分自身を呼び出す
– 変数のスコープに注意が必要• 関数より外なのか、中なのか
– 一時変数などはスタックに確保• あふれると異常終了する
• 再帰的アルゴリズムを実装するのに最適
���������������������������������������������������������������������������� �
ハノイの塔の解法
• 円盤w個のハノイの塔を解くには– 杭をそれぞれ���� �� �とする
– �個の円盤は��に積まれている
pq ��– pハノイを何らかの方法でuvwに移動
zq �枚目の円盤をu�に移動
�q ��– pハノイを何らかの方法でu�に移動
「何らかの方法」って… (�・ω・!)
���������������������������������������������������������������������������� ��
+,-,.で考えてみる
pq ��– pハノイを何らかの方法でuvwに移動– �– "���# なのでなにもしない
zq �枚目の円盤をu�に移動– 円盤をKL�Mから��に移動
�q ��– pハノイを何らかの方法でu�に移動– �– "���# なのでなにもしない
できたっぽい!QR・ω・UV�
���������������������������������������������������������������������������� ��
実演
���������������������������������������������������������������������������� ��
実装例の
紹介
���������������������������������������������������������������������������� ��
ソースコードをご覧ください
• ポイント解説
– ハノイを解く部分:��u� u����������6�~�• 引数の配列Qスタックとして使用Vは参照渡し
• d�� e���QV が"になるまで自分自身を呼び出す
• えっと…もうないや
���������������������������������������������������������������������������� ��
余談:終わる世界
• 解くために必要な移動回数
→ 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
���������������������������������������������������������������������������� ��
まとめと感想
• ハノイの塔なんて初めて書いた
– 意外と勉強になった
• とある課題…だったんだけど不要になったのでネタにした
– �������書いた
• つい手元にある���で書いた
– ���wでさらっと書けるとカッコいいな
���������������������������������������������������������������������������� ��
参考文献
• ハノイの塔 – ����w���– 別の解法もあるので参照してみよう
» ������������� �������������������������������������������
�������������
• ����v���– "##種類以上の言語でハノイの塔を実装している
• #$�%&'(って!
» �������� �� ���� ���� ����� ��!�������
• 【楽天市場】:木のおもちゃ製作所・銀河工房– 写真拝借しました。
» ����������"� ����������#��$�%���&��%������
���������������������������������������������������������������������������� ��
ご清聴ありがとうございました。