博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数据结构和算法-递归应用(汉诺塔、欧几里得求最大公约数、泊松分酒)
阅读量:2445 次
发布时间:2019-05-10

本文共 2445 字,大约阅读时间需要 8 分钟。

汉诺塔问题:

汉诺塔问题是一个经典的问题。汉诺塔(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

 

泊松分酒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:0v1:4;v2:8;v3:0v1:4;v2:3;v3:5v1:9;v2:3;v3:0v1:9;v2:0;v3:3v1:1;v2:8;v3:3v1:1;v2:6;v3:5可以倒出目标酒量

 

转载地址:http://srpqb.baihongyu.com/

你可能感兴趣的文章
Ubuntu 12.04中的8个新功能,精确的穿山甲
查看>>
如何在Windows 10的开始菜单中搜索所有PC文件
查看>>
如何在Ubuntu 12.04中重新启用Hibernate
查看>>
如何在Linux上使用time命令
查看>>
pdf导入excel表格_如何将PDF插入Excel
查看>>
chromebook刷机_关闭盖子时如何保持Chromebook开机
查看>>
如何在iPhone或iPad上隐藏您的应用程序文件夹名称
查看>>
谷歌书签删除重复_如何删除Google表格中的重复项
查看>>
autohotkey_如何编写一个AutoHotkey脚本
查看>>
如何在Ubuntu上安装KVM和创建虚拟机
查看>>
科尔颂 弗拉基米尔_每日新闻综述:科尔希望您的亚马逊回归
查看>>
outlook使用技巧_微软新Outlook.com的6个技巧和窍门
查看>>
我们尝试了Microsoft的Mac浏览器的New Edge,您也可以
查看>>
如何在Windows 7任务栏上提供更多空间
查看>>
什么是“系统空闲进程”,为什么使用那么多的CPU?
查看>>
我的Internet路由器可能会磨损吗?
查看>>
不是bios引导是什么意思_引导后我的BIOS会做什么?
查看>>
edge chromium_微软的Chromium-Powered Edge具有深色模式,这是启用它的方法
查看>>
op 圣诞节活动_您所说的话:您的怪异圣诞节清单上有什么
查看>>
如何在Windows 8“开始”屏幕上禁用动画
查看>>