遞歸(二)-------經典遞歸實例(漢諾塔問題)

      上一篇文章討論一個經典的遞歸實例(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);
         }
        
    }
}
    這個例子須要好好的體會。
相關文章
相關標籤/搜索