上一篇文章討論一個經典的遞歸實例(Fibonacy數列問題),如今來討論一下另一個經典的遞歸例子:漢諾塔問題: java
問題描述:在一個銅板上面立有三根杆(編號A/B/C),A杆上串有若干大小不一的金盤,且小盤在上大盤在下,要把A杆上面的金盤所有轉移到C盤上面去,且維持原有的順序,搬運過程當中能夠藉助B杆,可是必須遵循下列兩條規則: this
● 每次只能移動一個盤子 spa
●在每次移動中不容許出現大盤壓在小盤上面的狀況 .net
如今對問題進行分析:把金盤按照從小到大進行編號,依次爲p一、p二、p3.....pn而後: code
當n=1時,直接從A盤移到C盤 blog
當n>1時,把搬運任務進行分解: 遞歸
第一步,將A上的n-1(杆頂部的)個盤子從A上面搬到B上面,借組C杆 get
第二步,將pn(第n個盤子)從A杆搬到C杆 class
第三步,將B上面的n-1個金盤搬到C上面,借組A杆 im
具體實現代碼以下:
public class TestHanoi{ privte int times=0; //用來計算搬移的次數 public static void main(String []args){ TestHanoi t=new TestHanoi(); t.hanoi(3,"A","B","C"); } public void hanoi(int n,char a,char b,char c){ //有n個金盤,a/b/c爲杆 //當n=1時直接搬運 if(n==1){ times++ System.out.println(times+":"+」將p1從」+a+"搬到"+c); }else{ this.hanoi(n-1,a,c,b); times++; System.out.println(times+":"+」:\t」+」將p」+"n"+"從"+a+"搬到"+c); this.hanoi(n-1,b,a,c); } } }這個例子須要好好的體會。