漢諾塔問題(思路及實現)

2021-10-02 18:41:17 字數 2108 閱讀 1634

什麼是漢諾塔?

遞迴思路:

當只有乙個盤子的時候,只需要從將a塔上的乙個盤子移到c塔上。

當a塔上有兩個盤子是,先將x塔上的1號盤子(編號從上到下)移動到y塔上,再將x塔上的2號盤子移動的z塔上,最後將y塔上的小盤子移動到z塔上。

當x塔上有3個盤子時,先將x塔上編號1至2的盤子(共2個)移動到y塔上(需借助z塔),然後將x塔上的3號最大的盤子移動到z塔,最後將y塔上的兩個盤子借助x塔移動到z塔上。

當x塔上有n個盤子是,先將x塔上編號1至n-1的盤子(共n-1個)移動到y塔上(借助z塔),然後將x塔上最大的n號盤子移動到z塔上,最後將y塔上的n-1個盤子借助x塔移動到z塔上。

如圖, 首先說一下將x上的三個盤子放到z上該怎麼實現?

第一步,將第乙個x上的圓盤移到z,  x — > z

第二步,將第二個x上的圓盤移到y, x—>y

第三步,將z上的圓盤移到y,z—>y

第四步,將x上的圓盤移到z,x—>z

第五步,將y上的第乙個圓盤移到x, y—>x

第六步,將y上的盤子移到z,  y—>z

第七步,將x上的盤子移到z,    x—>z

到這裡就完成了簡單的三個盤子的移動。這裡把乙個盤子看成乙個整體,也可以把兩個盤子看成乙個整體來做,思路都是一樣的。

下面是先將x上的前兩個盤子看成 乙個整體進行移動之後拆開再單獨移動。其實也一樣,最後還要將前兩個拆開單獨進行移動。

圖一:基本思路

前兩個x—>y        //hanno(n-1,begin,end,mid);

x z y

前乙個x—>z

第二個x—>y

前乙個z—>y

第三個x—>z

前兩個y—>z // hanno(n-1,mid,begin,end);

前乙個y—>x y x z

第二個y—>z

前乙個x—>z

圖二:程式**

class hanno                                     

public static void hanno(int n,string begin,string mid,string end)else}}

就比如三個盤子:hanno(n-1,begin,end,mid);  意思是:將前兩個盤子從x移到y,借助z.此時begin為x,end為z,mid為y。同理,hanno(n-1,mid,begin,end);將前兩個盤子從y移到z借助x。

執行結果:

再對比一下圖一:

是不是恍然大悟了。

漢諾塔解題思路

漢諾塔塔問題符合數學統計歸納,千萬別試圖去理解n層移動問題 或者說去理解n層遞迴,人腦真不夠用 理解3層漢諾塔問題就行。總結起來如下 遞迴的理解的要點主要在於放棄 放棄你對於理解和跟蹤遞迴全程的企圖,只理解遞迴兩層之間的交接,以及遞迴終結的條件。如果a柱子只剩乙個盤子,那麼直接移動到c柱子即可 把 ...

漢諾塔問題(java實現)

漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。假設有x,y,z...

遞迴實現漢諾塔問題

遞迴的思想是將乙個大的複雜的問題分成小的問題來解決,而要求是小的問題與大的問題有相似的解法,並且問題的規模越來越小,並且必須存在遞迴出口。下面就用 完成漢諾塔問題 總結 通過遞迴實現漢諾塔的例子我們可以看出,在涉及大型而複雜的問題時,遞迴會使程式在總體上變得簡單易於理解,而涉及遞迴的呼叫過程時則會比...