漢諾塔問題算法
以下圖所示,從左到右有A、B、C三根柱子,其中A柱子上面有從小疊到大的n個圓盤,現要求將A柱子上的圓盤移到C柱子上去,期間只有一個原則:一次只能移到一個盤子且大盤子不能在小盤子上面,求移動的步驟和移動的次數code
1個盤的時候,只須要移動1次便可達成目標,g(1) = 1
)(步驟一)blog
2個盤的時候,須要移動3次便可達成目標,g(2) = 3
(步驟二)遞歸
3個盤的時候,咱們須要將底下較大的兩個盤先移動到C中,以後再將A中剩下的那個盤移動到C中。im
這裏須要注意的是,咱們是將底下的2個盤當作了一個,因此是至關於進行了2次步驟二須要2*g(2)次
next
以後就是步驟一的那種狀況 ,須要1次移動
static
g(3)=2*g(2)+1
img
通式爲g(n)=2*g(n-1)+1
移動
遞歸出口爲n=1
co
System.out.println("請輸入盤片數:"); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.close(); long result = han(n); System.out.println("總移動次數爲"+result); } public static long han(int n){ long s; if(n==1){ s=1; }else{ s =2*han(n-1)+1; } return s; }