算法學習——遞歸之漢諾塔

算法描述

漢諾塔問題算法

以下圖所示,從左到右有A、B、C三根柱子,其中A柱子上面有從小疊到大的n個圓盤,現要求將A柱子上的圓盤移到C柱子上去,期間只有一個原則:一次只能移到一個盤子且大盤子不能在小盤子上面,求移動的步驟和移動的次數code

算法思路

  1. 1個盤的時候,只須要移動1次便可達成目標,g(1) = 1)(步驟一)blog

  2. 2個盤的時候,須要移動3次便可達成目標,g(2) = 3(步驟二)遞歸

  3. 3個盤的時候,咱們須要將底下較大的兩個盤先移動到C中,以後再將A中剩下的那個盤移動到C中。im

    這裏須要注意的是,咱們是將底下的2個盤當作了一個,因此是至關於進行了2次步驟二須要2*g(2)次next

    以後就是步驟一的那種狀況 ,須要1次移動static

    g(3)=2*g(2)+1img

    通式爲g(n)=2*g(n-1)+1移動

    遞歸出口爲n=1co

算法實現

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;
    
}

結果

相關文章
相關標籤/搜索