/** * 漢諾塔大學的時候就學過,但是根本沒搞明白,唯一知道的就是要用遞歸的方法來求解。 * 問題描述: * 有三根桿子A,B,C。 A桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。 * 要求按下列規則將所有圓盤移至C桿: * 1.每次只能移動一個圓盤; * 2.大盤不能疊在小盤上面。 * 提示:可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿, * 但都必須尊循上述兩條規則。 * 問:如何移?最少要移動多少次? * 解決方法: * 假設只有2個盤子,柱子分別是A, B, C柱。那麼只需要三步就可以把他們從A柱移到C柱, * 這三步是A->B, A->C, B->C。 * 如果盤子數n超過2呢,我們就可以把這些盤子看成由最下面的那個盤子和上面n-1個盤子兩部分, * 這兩部分同樣可以用上面的三步實現移動。 * 也就是說我們可以通過遞歸地調用上面的步驟實現將所有n個盤子從A柱移動到C柱。 */ package al; public class Hanoi { public static void main(String[] args) { Hanoi hanoi = new Hanoi(); hanoi.move(3, 'A', 'B', 'C'); } /* * * @author * @param n 盤子數目* @param from 起始柱子* @param temp 中間柱子* @param to 目標柱子*/ public void move(int n, char from, char temp, char to) { if( n == 1) { System.out.println("Move 1 plate from " + from + " to " + to); } else { move(n-1, from, to, temp); move(1, from, temp, to); move(n-1, temp, from, to); } } }