棧的數據結構很是適合漢諾塔來解釋,由於兩者的操做原理是同樣的,由此也衍生了針對漢諾塔的依稀額算法。其中一個就是三根柱子的漢諾塔的移動步驟。算法
這裏咱們詳細的介紹一個漢諾塔的移動原理,假設三根柱子分別是A、B、C,一開始A上有N個圓盤,從小到大、從上到下分別是一、2......N-一、N,咱們要把A上的N個圓盤遠不移動到C上面,而每次只能移動每根柱子上面的一個圓盤。數據結構
咱們能夠反過來考慮一下,若要把A上的圓盤所有移動到C上,那麼須要把前N-1的盤子按照順序落到B上了,最後的第N個圓盤纔可以直接從A移動到C上,從而完成第N個圓盤的移動。以後把B的N-2個圓盤移動到A上,再把B上剩下的一個圓盤,也就是N-1個圓盤直接移動到C上,這是就已經完成最下面的兩個圓盤的移動,繼續這樣的移動,直接就完成有洗。函數
上面的步驟在代碼上使用遞歸是最好實現的,要使用遞歸,就要考慮到須要進行遞歸的部分是那部分。code
public class Hanoi { private static int moveNum = 0; private static void hanoi(int n, char a, char b, char c) { if (n == 1) { //若是隻有一個圓盤,只須要移動就好 move(a, c); return; } //先把A上的n-1個元哦按移動到B上 hanoi(n - 1, a, c, b); //把A上的最後一個圓盤移動到C上 move(a, c); //接下來遞歸,把B上的n-1個圓柱移動到C上 hanoi(n - 1, b, a, c); } private static void move(char a, char c) { moveNum++; System.out.println(a + "--->" + c); } public static void main(String[] args) { hanoi(3,'A','B','C'); System.out.println(moveNum); } }
hanoi函數的第1個參數就是柱子上須要移動的元哦按的個數,後三個參數分別爲一根柱子的標識。首先當n爲1時,須要移動的圓盤只有一個,直接把A上的圓盤移動到C上就能夠了,同時代碼結束,由於已經沒有須要移動的圓盤了。遞歸
接下來就是實現漢諾塔實現的關鍵,即把A上的全部圓盤移動到C上,須要先把A最上面的n-1個圓盤移動到B上,因而有了「hanoi(n-1,a,c,b)」,就能夠完成移動,這就是遞歸調用的思想所在了。class
在遞歸調用中會繼續執行該方法,改變參數的值,繼續打印,這樣每次調用會減小n的值,直到n最後變爲1以後,結束遞歸調用,最終完成漢諾塔移動。原理
轉變一下思想,就可以理解從B上移動n-1個圓盤到C上其實和從A上移動元哦按到C上是同樣的。方法