汉诺塔(java版)
漢諾塔原理
漢諾塔規則:有A、B、C三根柱子,設漢諾塔層數為N,則最底最大的一個盤數便是N。例如下圖有三層則N=3,我們只需將A柱上(1-N)個盤全部移至B柱或C柱上即可(挪動盤時,N值大的必須放在N值小的下面)。
分析
這道題最簡便的方式就是遞歸,你要問我為啥用遞歸,因為我沒考慮過用循環來解決這題,而且碰巧最近剛學了時間復雜度現學現賣,所以用遞歸也是沒啥毛病的。 很多人應該都懂這道題的原理和解題思路但是就是無法用代碼來實現。emmm,最關鍵的還是沒有get到這題的點,我們一開始便說漢諾塔的層數,所以層數就是誤導朋友們最大的障礙。 但是回過頭來想,無論是3層5層10層,都是萬變不離其宗的,無論多少層它第一次移動的都必須是最頂上N=1的那個盤,第二次移動的都得是N=2的那個盤,第三次移動的還得是N=1的那個盤。 所以說這就是規律,我們只需要簡單的分析一下N=3和N=4時的情況,后面的東西就會豁然開朗了。實例分析:
當N=3時:
1 A–>B
2 A–>C
1 B–>C
3 A–>B
1 C–>A
2 C–>B
1 A–>B
這就是漢諾塔N=3時運行的全過程
代碼
public static void hannuota(int N, char from, char to, char help) {// 3,A,B,Cif (N == 1) {System.out.println(N + " " + from + "-->" + help);return;}hannuota(N - 1, from, help, to);System.out.println(N + " " + from + "-->" + help);hannuota(N - 1, to, from, help);// System.out.println(N + " " + from + "-->" + help);}```mermaid代碼詳解
因為我們需要從上到下進行移動,在這種情況下,遞歸就會發揮出最大的作用。
(N用于存放層數,from,to,help分別表示三根柱子)//3,A,B,C
當運行到N==1時我們就開始進行盤的移動。
假設3個盤都在A柱上,先將1盤挪到C柱上,此時A柱上還有2、3盤
挪動后將 返回上級函數再將2盤的位置及挪的方位輸出。
1、2挪動后就沒有位置了,所以我們還需要進行二次遞歸對C柱上的1盤進行移動。
其實不用想的過于復雜,只需要將N=3時的情況搞定后面的多層也就迎刃而解
原因就是如果N=4時我們已經將1-N-1都挪到了C柱上表面空著的是B柱。實則A柱B柱都可以視為空,因為我們將A柱上的4盤挪到B柱后,A柱為空,但B柱上的是最大的一個盤所以我們可以在其上面放置任意的盤,因為不會再有盤會比B柱上的N盤更大了,一次類推,即使N=10,當我們將1-(N-1)挪到C后,也會是一樣的算法。
這道題最誤導人的地方便是每個柱之間的切換。在代碼上也表現的很清楚,每次遞歸的時候輸入的位置都會有所改變的。
第一個遞歸:
N=3 A B C
N=2 A C B
N=1 A B C
通過對柱位置的修改我們可以實現盤的移動。
第一個遞歸完成后我們的N個盤就實現了N盤的移動
第二個遞歸:
第二個遞歸就相當于第一個的往復只不過空閑柱從C柱轉移到了A柱,所以我們只需要理解到第一個遞歸的原理,第二個就沒什么難度了。
#編程小白,大神勿噴。
總結
以上是生活随笔為你收集整理的汉诺塔(java版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]计算机视觉牛人(转载)(最早在自
- 下一篇: 简述UITableView的属性和用法