ハノイの塔の再帰的な解決策は、ペグ A から C に N 個のディスクを移動する場合、最初に N-1 を A から B に移動し、次に一番下のディスクを C に移動し、次に N- を再度移動するように機能します。 BからCまでの1枚のディスク。
hanoi(from, to, spare, N):
hanoi(from, spare, to, N-1)
moveDisk(from, to)
hanoi(spare, to, from, N-1)
明らかに hanoi( _ , _ , _ , 1) は 1 回の移動を行い、hanoi ( _ , _ , _ , k) は 2 * hanoi( _ , _ , _ , k-1) + 1 の移動を行います。解の長さは 1, 3, 7, 15, ... の順に大きくなります。これは (1 << k) - 1 と同じシーケンスであり、投稿したアルゴリズムのループの長さを説明しています。
解自体を見ると、N = 1 の場合は次のようになります。
FROM TO
; hanoi(0, 2, 1, 1)
0 2 movedisk
N = 2 の場合、次のようになります。
FROM TO
; hanoi(0, 2, 1, 2)
; hanoi(0, 1, 2, 1)
0 1 ; movedisk
0 2 ; movedisk
; hanoi(1, 2, 0, 1)
1 2 ; movedisk
そして、N = 3 の場合は次のようになります。
FROM TO
; hanoi(0, 2, 1, 3)
; hanoi(0, 1, 2, 2)
; hanoi(0, 2, 1, 1)
0 2 ; movedisk
0 1 ; movedisk
; hanoi(2, 1, 0, 1)
2 1 ; movedisk
0 2 ; movedisk ***
; hanoi(1, 2, 0, 2)
; hanoi(1, 0, 2, 1)
1 0 ; movedisk
1 2 ; movedisk
; hanoi(0, 2, 1, 1)
0 2 ; movedisk
ソリューションの再帰的な性質のため、FROM 列と TO 列は再帰的ロジックに従います。列の中央のエントリを取得すると、上下の部分は互いのコピーになりますが、数値は並べ替えられます。これは、ペグ番号に対して演算を実行せず、並べ替えのみを行うアルゴリズム自体の明らかな結果です。N=4 の場合、中央の行は x=4 にあります (上の 3 つの星でマークされています)。
ここで、式 (X & (X-1)) は X の最小セット ビットの設定を解除するため、たとえば次のように 1 から 7 までの数値をマップします。
1 -> 0
2 -> 0
3 -> 2
4 -> 0 (***)
5 -> 4 % 3 = 1
6 -> 4 % 3 = 1
7 -> 6 % 3 = 0
トリックは、中央の行は常に正確に 2 の累乗にあるため、ちょうど 1 つのビットが設定されているため、中央の行の値 (この場合は 4) を行 (つまり、4=0+4、6=2+6)。これは「コピー」プロパティを実装し、真ん中の行の追加は順列部分を実装します。式 (X | (X-1)) + 1 は、右側に 1 を持つ最下位のゼロ ビットを設定し、これらのビットをクリアするため、期待どおりの同様のプロパティが得られます。
1 -> 2
2 -> 4 % 3 = 1
3 -> 4 % 3 = 1
4 -> 8 (***) % 3 = 2
5 -> 6 % 3 = 0
6 -> 8 % 3 = 2
7 -> 8 % 3 = 2
これらのシーケンスが実際に正しいペグ番号を生成する理由について、FROM 列を考えてみましょう。再帰的な解決策は hanoi(0, 2, 1, N) で始まるため、中央の行 (2 ** (N-1)) では movedisk(0, 2) が必要です。再帰規則により、(2 ** (N-2)) で movedisk(0, 1) と (2 ** (N-1)) + 2 ** (N-2) movedisk ( 1、2)。これにより、上の表のさまざまな順列で表示される from ペグの「0,0,1」パターンが作成されます (0,0,1 の行 2、4、および 6 と 0,0 の行 1、2、3 を確認してください)。 、2、および 1、1、0 の行 5、6、7、すべて同じパターンの順列バージョン)。
では、2 のべき乗付近でオフセットを使用して自身のコピーを作成するという特性を持つすべての関数の中で、作成者は 3 を法として正しい順列を生成する関数を選択しました。3 つの整数 0..2 の可能な順列は 6 つしかなく、順列はアルゴリズム内で論理的な順序で進行するため、これはそれほど難しい作業ではありません。(X|(X-1))+1 は必ずしもハノイ問題と深く関連しているわけではなく、そうである必要もありません。コピーの性質があり、たまたま正しい順序で正しい順列が生成されれば十分です。