Java數據結構和算法-遞歸應用(漢諾塔、歐幾里得求最大公約數、泊松分酒)

漢諾塔問題:

漢諾塔問題是一個經典的問題。漢諾塔(Hanoi Tower),又稱河內塔,源於印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。

由於圓盤數64計算過於龐大,本例以圓盤數3爲例子。

漢諾塔問題Java實現:

package com.algorithm.recursion;

public class HanNota {
    private int i=1;
    //取n=3,字符A、B、C說明。將A柱中最大的盤子以B柱爲依賴,放到C柱上。
    public void hanNota(int n,char from,char dependOn,char to){
        if(n==1){
            move(1,from,to);
        }else{
            //將A柱中第二大的盤子及以下的盤子以C柱爲依賴,放到B柱上。
            hanNota(n-1,from,to,dependOn);
            //將A柱中最大的盤子放到C柱上。
            move(n,from,to);
            //反轉:將B柱中盤子以A柱爲依賴,放到C柱上。
            hanNota(n-1,dependOn,from,to);
        }
    }

    private void move(int n, char from, char to) {
        System.out.println("第"+i+++"步從"+from+"---->"+to);
    }

    public static void main(String[] args) {
        char[] chars={'A','B','C'};
        HanNota h=new HanNota();
        h.hanNota(3,chars[0],chars[1],chars[2]);
    }
}
輸出:
第1步從A---->C
第2步從A---->B
第3步從C---->B
第4步從A---->C
第5步從B---->A
第6步從B---->C
第7步從A---->C

歐幾里得求最大公約數:

package com.algorithm.recursion;

/**
 * 歐幾里得求最大公約數
 */
public class Gcd {

    public static int gcd(int m,int n){
        if(m<n){
            return -1;
        }
        if(n==0){
            return m;
        }else {
           return gcd(n,m%n);
        }
    }

    public static void main(String[] args) {
        int x=gcd(88,24);
        System.out.println("x:"+x);
    }
}

 

泊松分酒Java實現:

有3個容器,容量分別爲12升,8升,5升。其中12升中裝滿油,另外兩個空着。要求你只用3個容器操作,最後使得某個容器中正好有6升油。

package com.algorithm.recursion;

/**
 * 泊松分酒
 */
public class ShareWine {
    //三種容量的杯子
    private int b1=12;
    private int b2=8;
    private int b3=5;
    //目標要倒出的酒量
    private int m=6;
    public void shaveWine(int v1,int v2,int v3){
        System.out.println("v1:"+v1+";v2:"+v2+";v3:"+v3);
        if(v1==m||v2==m||v3==m){
            System.out.println("可以倒出目標酒量");
            return;
        }
        //分酒策略:v1->v2->v3->v1
        if (v2!=0&&v3!=b3){
            if(v2+v3<=b3){
                shaveWine(v1,0,v2+v3);
            }else{
                shaveWine(v1,v2-(b3-v3),b3);
            }
        }else if(v2==0){
                if(v1<=b2){
                    shaveWine(0,v1,v3);
                }else{
                    shaveWine(v1-b2,b2,v3);
                }
        }else if(v3==b3){
                if(v3+v1<=b1){
                    shaveWine(v3+v1,v2,0);
                }else {
                    shaveWine(b1,v2,v3-(b1-v1));
                }
            }
        }

    public static void main(String[] args) {
        ShareWine s=new ShareWine();
        s.shaveWine(12,0,0);
    }
}
輸出:
v1:12;v2:0;v3:0
v1:4;v2:8;v3:0
v1:4;v2:3;v3:5
v1:9;v2:3;v3:0
v1:9;v2:0;v3:3
v1:1;v2:8;v3:3
v1:1;v2:6;v3:5
可以倒出目標酒量

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章