いわゆる、ハノイの塔をコンピューター上で再帰処理を行うことなく解くことを考える。
また、n個のハノイの塔をとくには、2^n−1のステップが必要であることはよくしられている。
(よって、ここでその証明は省く。)

概要(実際に紙と鉛筆でやってみることをお勧めします):

1個のハノイの塔をとく。
step-0step-1
[1] _I_ _I_
_I_ _I_ [1]
動かしたこまの番号は順に、


2個のハノイの塔をとく。
step-0step-1step-2step-3
[1] _I_ _I_
[2] _I_ _I_
_L_ _L_ _I_
[2] [1] _I_
_I_ _L_ _I_
_I_ [1] [2]
_I_ _I_ [1]
_I_ _I_ [2]
動かしたこまの番号は順に、
1−2−1

3個のハノイの塔をとく。
step-0step-1step-2step-3step-4step-5step-6step-7
[1] _I_ _I_
[2] _I_ _I_
[3] _I_ _I_
_L_ _I_ _I_
[2] _I_ _I_
[3] _I_ [1]
_L_ _L_ _I_
_L_ _L_ _I_
[3] [2] [1]
_L_ _L_ _I_
_L_ [1] _I_
[3] [2] _I_
_I_ _L_ _I_
_I_ [1] _I_
_I_ [2] [3]
_L_ _L_ _I_
_L_ _L_ _I_
[1] [2] [3]
_L_ _I_ _L_
_L_ _I_ [2]
[1] _I_ [3]
_I_ _I_ [1]
_I_ _I_ [2]
_I_ _I_ [3]
ここで動かしたこまの番号は順に、
1−2−1−3−1−2−1
動かすこまの番号の順に、またその動きに規則性めいたものを感じることだろう。
ここから、その規則性を利用し問題を解くことに役立てることにする。

3個のハノイの塔の場合、それぞれのこまは動かされるたびに、
1のこまは常に左隣りのバーへ、2のこまは右隣り、
3のこまは左隣りのバーへ移っていることがわかる。
(左端と右端をつながったものとして捉えたとする。)

これは一般化でき、n個のハノイの塔において、上からm番目のこまは、
n+mが奇数なら右隣のバーへ、偶数なら左隣のバーへ移動している。

またさらに、ステップ数を2進表示してみる。
step-000step-001step-010step-011step-100step-101step-110step-111
[1] _I_ _I_
[2] _I_ _I_
[3] _I_ _I_
_L_ _I_ _I_
[2] _I_ _I_
[3] _I_ [1]
_L_ _L_ _I_
_L_ _L_ _I_
[3] [2] [1]
_L_ _L_ _I_
_L_ [1] _I_
[3] [2] _I_
_I_ _L_ _I_
_I_ [1] _I_
_I_ [2] [3]
_L_ _L_ _I_
_L_ _L_ _I_
[1] [2] [3]
_L_ _I_ _L_
_L_ _I_ [2]
[1] _I_ [3]
_I_ _I_ [1]
_I_ _I_ [2]
_I_ _I_ [3]

そして、それぞれのステップにおいて、右側からビットを調べていくと、
最初に立っているビットの桁と動かすこまの番号が一致していることに気づく。
ステップ step-000step-001step-010step-011step-100step-101step-110step-111
最初に立ってる桁nothing2^12^22^12^32^12^22^1
実際の手順 [1] _I_ _I_
[2] _I_ _I_
[3] _I_ _I_
_L_ _I_ _I_
[2] _I_ _I_
[3] _I_ [1]
_L_ _L_ _I_
_L_ _L_ _I_
[3] [2] [1]
_L_ _L_ _I_
_L_ [1] _I_
[3] [2] _I_
_L_ _L_ _I_
_I_ [1] _I_
_I_ [2] [3]
_L_ _L_ _I_
_L_ _L_ _I_
[1] [2] [3]
_L_ _I_ _L_
_L_ _I_ [2]
[1] _I_ [3]
_I_ _I_ [1]
_I_ _I_ [2]
_I_ _I_ [3]
動かしたこまnothing1213121

(各々のステップにおいて、右側からビットを調べて最初に立っている桁は、
2^−2^−2^−2^−2^−2^−2^である。
先の動かしたこまの順と比較。一致している。)

よって、ハノイの塔は再帰処理を用いることなく次の手順で解ける。
またこの方法はメモリを無駄に消費することもない。

step=1;
while (step<2^n)
右からstepのビットを調べる
m番目のビットが立っていれば、m番目のこまを(−1)^(m+n−1)方向へ動かす
step +=1;
end

こまがn個のときはn−1個のときの手順を二回繰り返すことと、その間に一番大きなこまを、
ただ一度動かすという新たな手順が一手増えるというのが、このゲームの法則です。
それをステップ数の2進数と対応させるというところが、このアルゴリズムの目玉なのですが、
いかがでしょうか。

同様のアルゴリズムを用い再帰処理なしに、ドラゴン曲線を描くプログラムをVisualC++で作りました。
Win上で動くものです。ここ
許可なき転載禁止。
ご意見お待ちしております。 メールください。