我正在阅读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);
}
答案 0 :(得分:2)
这只是意味着:
向右骑自行车:
peg1 -> peg2
peg2 -> peg3
peg3 -> peg1
骑车到左边
peg1 -> peg3
peg2 -> peg1
peg3 -> peg2