自學演算法 河內塔問題(單色,雙色,三色)

2021-05-22 18:42:12 字數 1372 閱讀 6917

河內塔也就是大多數人所說的漢諾塔:

學過遞迴的人應該都聽說過,

但是我想真正理解漢諾塔的工作原理的同學確實寥寥無幾!

我想如果你能在1

分鐘之內把單色漢諾塔程式完整的寫出來並且成功執行,

那你遞迴理解的還可以了!

很多人說漢諾塔很不好理解!

但是他是遞迴的經典問題了!如果連它都弄不明白,就沒法深入了!

其實說白了也就是知其然,不知其所以然!

這裡我不講漢諾塔的原理,如果不懂,可以自己去翻翻書!

閒話少說,直奔主題!

單色:

我們先來說單色的也就是大家都知道的那種,只有一種顏色一定數量的盤子在乙個柱子上從小到大排列將它通過一根柱子,移到另一根柱子上!這個問題,不用我說了吧,下面該處演算法描述:

procedure hanoi(n, a, b, c) [

if(n == 1) [

print("move sheet " n " from " a " to " c);

]else [

hanoi(n-1, a, c, b);

print("move sheet " n " from " a " to " c);

hanoi(n-1, b, a, c);

]   ] 

雙色:如下圖,就是要把所有的換色盤子最終都放在第二個柱子上(順序還是小的在上,大的在下!),而藍色的盤子全部放在第三根柱子上(從小到大)!這個就要複雜一下啦,其實原理都是一樣的!

以下面的為例子:

第一次移動:我們想辦法把最底層的兩個盤子分別移到第二個和第三個柱子上,至於頂上那些盤子怎麼移動,你先不要管,交給遞迴就可以了!

移動之後:現在上次柱子二和柱子三上的兩個盤子已經放好了,也不再需要移動了!你就可以假設它們不存在!看成如下圖的形式,然後繼續重複最後上次的操作!但是記得最後一次要單獨討論啊!

接下來你就知道怎麼辦了吧!有沒有找到單色漢諾塔的感覺!

演算法的原理還是以單色漢諾塔為原型,只不過你要多次重複單色漢諾塔的移動過程!

還要注意邊界的問題,比如最後一次移動的時候要單獨討論!

三色:

希望你看了之後不要迷糊

!冷靜的思考一下!

這個也許更複雜一點!

我想如果二色的你懂了,這個也就不會很難了!

首先:還是把第一根柱子上最底下的三個盤分別放在三更柱子上!上面其他的怎麼弄,你暫時不要管!還是把它交給遞迴來處理!

然後:這個和雙色的類似,大家自己理解一下吧!

總結:其實無論單色雙色,

還是三色,原理都是一回事,你重要抓住了原理,問題也就迎刃而解了!

還有一點一定要注意,當你移動底層的盤子時,要注意其他盤子移動的次數,一定要保證移動偶數次,猜猜為什麼?這一點也不是絕對的!看你具體實現演算法的方式了!

雙色 三色排序問題

實現乙個函式,給定乙個陣列,要求使得陣列中負數在所有正數的前面 實現乙個函式,給定乙個陣列,要求使得陣列中負數在前正數在後零在中間 1 include2 include34 輸出陣列元素 5void print int arr,int len 6 交換兩個數 7void swap int left,...

Arduino使用三色 雙色LED

1 三色led 然後是這兩種led的實物圖,上搜了一下,這種三色led,有乙個gnd引腳的好像叫做共陰rgb全彩led發光二極體,總共有四個引腳 gnd引腳接arduino的gnd引腳,r g b三個引腳分別對應著red green blue,這三個引腳應該接arduino中的模擬引腳。顯示三色的原...

三色旗演算法

演算法描述 假設有一條繩子,上面有紅 白 藍三種顏色的旗子,起初繩子上的旗子顏色並沒有順序,您希望將之分類,並排列為藍 白 紅的順序,要如何移動次數才會最少,注意您只能在繩子上進行這個動作,而且一次只能調換兩個旗子。示意圖 解法 在一條繩子上移動,在程式中也就意味只能使用乙個陣列,而不使用其它的陣列...