我正在阅读 RobetSedwick 的 C++ 书中的算法。在这里,作者正在解释河内塔使用分而治之的设计和重现。
以下代码是问题的递归解决方案。它指定在每个步骤中应该移动哪个磁盘,以及在哪个方向上(+ 表示向右移动一个钉子,当在最右边的钉子上时,循环到最左边的钉子;和 - 表示向左移动一个钉子,循环到最左边的钉子。当在最左边的钉子上时,最右边的钉子)。
Disk3
Disk2
Disk1
Peg1 Peg2 Peg3
我的问题当磁盘位于左挂钩(即挂钩 1)上时,作者在“循环到最左边的挂钩”上方的意思是什么我们如何循环到最左边的挂钩?
作者还提到递归是基于以下思想:要将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);
}