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
可以倒出目标酒量

猜你喜欢

转载自blog.csdn.net/Colin_Qichao/article/details/81475778