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)