Algorithm 这是怎么回事?河内奇塔解决方案
当我发现河内塔楼不寻常的迭代解决方案时,我在互联网上迷失了方向:Algorithm 这是怎么回事?河内奇塔解决方案,algorithm,language-agnostic,bit-manipulation,towers-of-hanoi,Algorithm,Language Agnostic,Bit Manipulation,Towers Of Hanoi,当我发现河内塔楼不寻常的迭代解决方案时,我在互联网上迷失了方向: for(int x=1;x
for(int x=1;x<(1Hanoi towers of Hanoi)的递归解决方案的工作原理是,如果要将N个磁盘从peg A移动到C,首先将N-1从A移动到B,然后将底部的一个移动到C,然后再将N-1个磁盘从B移动到C
hanoi(from, to, spare, N):
hanoi(from, spare, to, N-1)
moveDisk(from, to)
hanoi(spare, to, from, N-1)
显然,河内(,,,,1)采取了一步,河内(,,,,k)采取了与2*河内(,,,,,k-1)+1一样多的步骤。因此,解决方案的长度按顺序1,3,7,15……增长。这与(1的顺序相同。这并没有直接回答这个问题,但太长了,无法发表评论
我总是通过分析下一步应该移动的磁盘大小来完成这项工作。如果查看移动的磁盘,结果是:
1 disk : 1
2 disks : 1 2 1
3 disks : 1 2 1 3 1 2 1
4 disks : 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
奇数大小总是以与偶数大小相反的方向移动,顺序为如果销钉(0,1,2,重复)或(2,1,0,重复)
如果你看一下这个模式,移动环是移动次数和移动次数+1的异或中的最高位。huima的解决方案基本上是正确的,但我想要更严格的,它太大了,无法放入注释中。下面是:
首先注意:在该算法的中间步骤x=2N-1,“from”peg为0,“to”peg为2N%3。这就剩下2(N-1)%3作为“备用”peg。
算法的最后一步也是如此,所以我们看到,实际上是作者的算法
是一个轻微的“欺骗”:他们将磁盘从peg 0移动到peg 2N%3,而不是固定的,
预先指定的“到”挂钩。无需太多工作即可更改
最初的Hanoi算法是:
hanoi(from, to, spare, N):
hanoi(from, spare, to, N-1)
move(from, to)
hanoi(spare, to, from, N-1)
插入“从”=0,“到”=2N%3,“备用”=2N-1%3,我们得到(抑制%3):
这里的基本观察结果是:
在第(c)行中,PEG正好是河内的PEG(0,2N-1,2N,N-1)移动了2N-1%3,即。
它们正是第(a)行的销钉,加上这个数量
我声称当我们
运行线(c),“从”和“到”销钉是线(a)的相应销钉移动2N-1%3。这
根据更简单、更一般的引理,在河内(a+x,b+x,c+x,N)
中,“from”和“to”销钉从河内(a,b,c,N)
中精确地移动x
现在考虑函数
f(x)=(x&(x-1))%3
g(x)=(x |(x-1))+1%3
为了证明给定的算法有效,我们只需证明:
- f(2N-1)==0和g(2N-1)==2N
- 对于0
这两个都很容易显示。对于任何想要更多解释的人,我也找到了这个链接:我澄清了它正在设置最小设置位。@jva模3不能忽略高阶位,例如8%3==2,但0%3==0
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
1 -> 0
2 -> 0
3 -> 2
4 -> 0 (***)
5 -> 4 % 3 = 1
6 -> 4 % 3 = 1
7 -> 6 % 3 = 0
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
1 disk : 1
2 disks : 1 2 1
3 disks : 1 2 1 3 1 2 1
4 disks : 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
hanoi(from, to, spare, N):
hanoi(from, spare, to, N-1)
move(from, to)
hanoi(spare, to, from, N-1)
hanoi(0, 2**N, 2**(N-1), N):
(a) hanoi(0, 2**(N-1), 2**N, N-1)
(b) move(0, 2**N)
(c) hanoi(2**(N-1), 2**N, 0, N-1)