漢諾塔算法的理解

當盤子數爲兩個時,移動圖以下: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

  1. 中間以上動做是:源柱子(A)不變,目標柱子爲C,輔助柱子爲B進行移動,也就是orm

    源柱子->目標柱子blog

    源柱子->輔助柱子遞歸

    目標柱子->輔助柱子get

  2. 中間動做:從A到C也就是從源柱子到目標柱子it

  3. 中間如下動做:源柱子是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');
    }
}

一開始我理解這個算法的時候總是一直在分析程序的出棧,入棧動做,後面看了這篇文章漢諾塔的遞歸算法與解析纔有點恍然大悟,這個算法其實是考驗對遞歸思想的理解:總結事物的規律,而後再用程序表達出來。

相關文章
相關標籤/搜索