簡體   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