ハノイの塔 Tower of Hanoi

Java

Java でハノイの塔をプログラミングしてみました。

再帰アルゴリズムでググるとほとんどの言語でサンプルがあります。

しかし、再帰アルゴリズムは理屈では理解できても実際に使おうとすると難しいものです。

そこで NetBeans を使って再帰アルゴリズムの仕組みをみていこうと思います。

まず、ハノイの塔についておさらいしておきましょう。

Wikipedia によると、ハノイの塔は、フランスの数学者エドゥアール・リュカが1883年に発売したゲーム『ハノイの塔』がルーツである。

その内容は下記のようになっている。

 

インドのガンジス河の畔のヴァラナシ(ベナレス)に、世界の中心を表すという巨大な寺院がある。

そこには青銅の板の上に、長さ1キュビット、太さが蜂の体ほどの3本のダイヤモンドの針が立てられている。

そのうちの1本には、天地創造のときに神が64枚の純金の円盤を大きい円盤から順に重ねて置いた。

これが「ブラフマーの塔」である。司祭たちはそこで、昼夜を通して円盤を別の柱に移し替えている(移し替えのルールの説明は省略)。

そして、全ての円盤の移し替えが終わったときに、世界は崩壊し終焉を迎える。

 

n 枚の円盤すべてを移動させるには最低 2^n-1 回(2のn乗 – 1 回)の手数がかかります。

なんか恐ろしいですね。

それにハノイの塔じゃなくてブラフマーの塔になってます。( なんでだろう? )

さて。肝心の移し替えのルールをザックリと確認しましょう。

移し替えの際、円盤は一回に一枚しか移し替えできない。

小さな円盤の上に大きな円盤を重ね置くことはできない。

実にシンプルなルールですね。

しかし、シンプルだからといって侮れません。

考え方としては円盤の枚数を n 枚とします。

そして円盤が重ね置いてあるダイヤの針は左( LEFT )とします。

移し替え先のダイヤの針は右( RIGHT )、そして移し替え作業用のダイヤの針を中央( CENTER )とします。

まず、n -1 枚の円盤を中央のダイヤの針に移し替えます。

そして、右のダイヤの針に左のダイヤの針に残っている一番大きな円盤( n 枚目の円盤 )を移し替えます。

次に中央のダイヤの針に移し替えられた n-1 枚の円盤を左のダイヤの針に移し替えます。

言葉よりプログラムの流れで確認したほうが理解し易いかもしれませんね。

上記の考え方を再帰アルゴリズムを利用して組んだコードがこれです。

素人が作ったプログラムなので読みにくいとは思いますがじっくりプログラムの流れを確認してください。

 

yucchi.jp.hanoi.Hanoi.java

どうでしょうか?

理解できましたでしょうか?

考え方は非常にシンプルだけどけっこう流れは追っていくと複雑に感じますね。

いちおう参考までにこれも貼っておきます。

1

hanoi メソッドが再帰的に実行されているのが確認できます。

これで再帰アルゴリズムで複雑な繰り返し処理を記述できるようになったとはとても思えないけど

ちょっとは再帰アルゴリズムの使いどころを理解したつもりになりました。

たぶん、すぐに忘れてしまうだろうけどまた挑戦してみたらいいだけのことだし。

気楽に楽しんでいこう! (*^o^*)

a_001

再帰アルゴリズムについてはこちらで簡単な覚え書きを残してあります。

再帰アルゴリズム その1

再帰アルゴリズム その2

ユークリッドの互除法 Euclidean Algorithm

Hatena タグ: