當盤子數爲兩個時,移動圖以下:java
移動規律爲:算法
步驟 | 盤子編號 | 源柱子 | 目標柱子 |
1 | 1 |
A | B |
2 | 2 | A | C |
3 | 1 | B | C |
當盤子數爲3個時:spa
移動規律爲:.net
步驟 | 盤子編號 | 源柱子 | 目標柱子 |
1 | 1 | A | C |
2 | 2 | A | B |
3 | 1 | C | B |
4 | 3 | A | C |
5 | 1 | B | A |
6 | 2 | B | C |
7 | 1 | A | C |
從以上移動移動規律能夠總結出,當步驟序號和盤子數目相同時,就是把最底下的盤子從A移動到C,其它的步驟都是對等的,規律以下:code
中間以上動做是:源柱子(A)不變,目標柱子爲C,輔助柱子爲B進行移動,也就是orm
源柱子->目標柱子blog
源柱子->輔助柱子遞歸
目標柱子->輔助柱子get
中間動做:從A到C也就是從源柱子到目標柱子it
中間如下動做:源柱子是B,目標柱子爲C,輔助柱子爲A進行移動,也就是
源柱子->輔助柱子
源柱子->目標柱子
輔助柱子->目標柱子
按照以上規律,能夠大概總結出實際上移動的主要動做實際上就是在重複三步動做,用java代碼能夠表示以下:
/** * @author lenovo * */ public class Hanoi { /** * * @param n 盤子的數目 * @param origin 源座 * @param assist 輔助座 * @param destination 目的座 */ public void hanoi(int n, char origin, char assist, char destination) { if (n >= 1) { hanoi(n - 1, origin, destination, assist); System.out.println("Direction:" + origin + "--->" + destination); hanoi(n - 1, assist, origin, destination); } } public static void main(String[] args) { Hanoi hanoi = new Hanoi(); hanoi.hanoi(3, 'A', 'B', 'C'); } }
一開始我理解這個算法的時候總是一直在分析程序的出棧,入棧動做,後面看了這篇文章漢諾塔的遞歸算法與解析纔有點恍然大悟,這個算法其實是考驗對遞歸思想的理解:總結事物的規律,而後再用程序表達出來。