河内塔的递归解决方案

时间:2012-09-07 11:52:49

标签: algorithm towers-of-hanoi

我正在阅读RobetSedwick的C ++丛书算法。在这里,作者用分而治之的设计和复发来解释河内塔。

Followin代码是问题的递归解决方案。它指定每个步骤应移动哪个磁盘,以及在哪个方向上移动(+表示向右移动一个挂钩,在最右侧挂钉时循环到最左边的挂钉;以及 - 表示向左移动一个挂钩,循环到在最左侧钉住最右边的钉子。

Disk3          
Disk2
Disk1

Peg1      Peg2   Peg3

我的问题当磁盘处于左侧挂钩(即,第1页)时,作者的意思是“骑自行车到最左边的挂钩”我们如何循环到最左边的挂钩?

作者还提到Recursion基于以下思路:要向右移动N个磁盘一个挂钩,我们首先将顶部N-1个磁盘向左移动一个挂钩,然后向右移动磁盘N一个挂钩,然后移动N-1个磁盘再向左一个挂钩(在磁盘N上)。

我对上面的左右术语感到困惑。任何人都可以解释一下。

void hanoi(int N, int d)
  {
    if (N == 0) return;
    hanoi(N-1, -d);
    shift(N, d);    
    hanoi(N-1, -d);
  } 

1 个答案:

答案 0 :(得分:2)

这只是意味着:

向右骑自行车:

peg1 -> peg2
peg2 -> peg3
peg3 -> peg1

骑车到左边

peg1 -> peg3
peg2 -> peg1
peg3 -> peg2