1. 程式人生 > >java遞迴之漢諾塔問題

java遞迴之漢諾塔問題

原始碼的github地址,可以下載到本地執行

package stack.demo;

/**
 * 漢諾塔問題:
 * 假設有三根柱子,x y z
 * x上有3個圓盤,從底部開始從大到小編號為n 到 1
 * 若每次只能移動一個圓盤,且大圓盤不能在小圓盤上面
 * 現在需要將3個圓盤 都從x柱子上都移動到z柱子上,且保持原來的順序,
 * 需要移動多少次? 若是n個圓盤呢?
 */
public class Hanoi {



    private static int num=0;//計數器

    /**
     * @param x 起始柱子
     * @param y 輔助柱子
     * @param z 目的柱子
     * @param n 盤子個數
     */
    public static void HanoiExcute(char x, char y, char z, int n) {
        //如果要把n個盤子都放到z上,那麼需要把n-1到1個盤子都放到y上,然後把第n個盤子放到z上,再把n-1到1個盤子都放到z上
        if (n==1){
            move(x,z,1);//將第1個盤子 從x移動到z
        }else {
            //將n-1到1之間的所有盤子從x移動到y
            HanoiExcute(x,z,y,n-1);
            move(x,z,n);//將第n個盤子從x移動到z
            //將n-1到1之間到所有盤子從y移動到z
            HanoiExcute(y,x,z,n-1);
        }
    }


    /**
     * @param a 起始柱子
     * @param b 目的柱子
     * @param n 盤子編號
     */
    public  static void move(char a,  char b, int n){
        num++;
        System.out.println("第"+num+"次移動,將盤子"+n+"從"+a+"移動到"+b);
    }



    public static void main(String[] args) {
        char x='x';
        char y='y';
        char z='z';
        int n=30;
        HanoiExcute(x,y,z,n);
    }

}

輸出結果
第1次移動,將盤子1從x移動到z
第2次移動,將盤子2從x移動到y
第3次移動,將盤子1從z移動到y
第4次移動,將盤子3從x移動到z
第5次移動,將盤子1從y移動到x
第6次移動,將盤子2從y移動到z
第7次移動,將盤子1從x移動到z

ps:漢諾塔問題的數學遞迴式子得到的時間複雜度為
2的n次方-1

經典的遞迴題目,要點在於兩點。
1.HanoiExcute(char x, char y, char z, int n)這個方法的目的,就是將x上的n個圓盤按原本 的順序從x移動到z上,y作為輔助柱子。引數含義為x是起始柱子,y是輔助柱子,z是目標柱子,n為圓盤個數。
遞迴的核心就是要定義好要遞迴的函式定義。
2.move(char a, char b, int n)

這個方法的目的是,從a柱子上將編號為n的圓盤移動到b柱子上。引數含義為,a為起始柱子,b為目標柱子,n為圓盤編號
原始碼的github地址,可以下載到本地執行