繁体   English   中英

我不懂河内算法

[英]I don't understand Hanoi algorithm

老实说:从今年年初(高中高中)到我们最终看到递归的那一天,我一直在编程方面做得很好。 我不明白河内塔的递归代码:我似乎没有得到的具体点是目标塔和原点之间的切换,反之亦然:

我基本上理解递归是什么,堆栈是什么,但我不明白为什么塔的顺序改变了。

对你的帮助表示感谢。 谢谢。 // N件数

    private void Déplacer(short N, string o, string i, string d)
    {
        if (N == 1)
        {
            MessageBox.Show("Move " + o + "to " + d);
            lstUn.Items.Add((lstUn.Items.Count + 1).ToString() + "-" + "Move " + o + " vers " + d);
            return;
        }


        else
        { 
        //Switch d and i
            Déplacer((short)(N - 1), o, d, i);
            lstUn.Items.Add((lstUn.Items.Count + 1).ToString() + "-" + "Déplace " + o + " vers " + d);
            MessageBox.Show("Déplace " + o + " vers " + d); //1 vers 3
            Déplacer((short)(N - 1), i, o, d);

        }

塔的顺序是改变的,因为两个递归步骤具有不同的目的。 对于其中一个,目的是“将整个堆栈从A塔移动到C塔”(目标#1)。 另一方面,目的是“通过将所有其他环放在塔B上”将底环从塔A移动到塔C“(目标#2)。

如果你看一个有3个环的例子,这可能是最容易理解的。 最初我们有:

A (3)(2)(1)
B
C

我们想将环从A移动到C,但为了做到这一点,我们首先需要将底环放在C上。因此,我们从目标#2开始。 在目标#2中,我们需要将所有其他环移动到B上,因此当我们进入它时,我们得到目标#1,但目标塔变为B.一旦完成,我们得到:

A
B (2)(1)
C (3)

现在我们有从B到C的目标#1。但是要做到这一点,我们首先从B到C有目标#2(从B到A基本上是目标#1)。 所以,基本上,目标塔会发生变化,因为每次递归步骤我们都会在目标#1和目标#2之间切换。

根据河内塔的规则,你永远不能把一个更大的磁盘放在一个较小的磁盘之上。

想象一下三座塔,塔1上有三个圆盘。 要将三个磁盘移动到塔3,您需要能够将最大的磁盘从塔1移动到塔3; 这意味着您必须将两个较小的磁盘从塔1移动到塔2.如何将两个磁盘从塔1移动到塔2? 那么,你需要将磁盘1移动到塔3; 然后你可以将磁盘2移动到塔2; 然后你可以将磁盘1从塔3移动到塔2.现在你可以将磁盘3移动到塔3; 并且您需要将两个磁盘从塔2移动到塔3 - 这意味着您将磁盘1移动到塔1; 然后磁盘2到塔3; 最后是磁盘1到塔3,完成了这个过程。

这就是算法的本质。 每当你需要将一些磁盘从一个塔移动到另一个塔时,你就会递归。

规则的结果是每隔一步移动最小的磁盘。

可以在http://en.wikipedia.org/wiki/Tower_of_Hanoi#Recursive_solution中找到该算法的一个很好的解释。

注意代码几乎是这个算法的线到线实现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM