算法基础:递归---汉诺塔问题
2016-03-13 22:40
459 查看
递归算法: 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的能力在于用有限的语句来定义对象的无限集合。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 /* * Hanio塔问题 * 设abc是三个塔,开始时,a塔上一共叠有n个圆盘,自上而下由大到小的叠在一起。各圆盘从小到大编号为1到n。 * 现要求将塔a的一叠圆盘移到塔b上,并按照同样的顺序叠置,并且在移动过程中遵守一下规则: * 1.每次只能移动一个圆盘 * 2.任何时刻都不允许将较大的圆盘压在较小的圆盘之上 * 3.在满足12的前提下可以任意将圆盘移动到abc任何一个上 * 在程序最初输入一个给定的n, 程序末尾输出一个由n确定的移动次数count; */ /* * 思路: * Hanio(n,a,b,c)表示将塔自上而下,由大到小叠在一起的n个圆盘依照移动规则移至塔b上并且按照同样顺序叠排。 * 移动过程中,以c为辅助塔, move(n,a,b)表示将塔a上编号为n的圆盘移至塔b上 */ import java.util.Scanner; public class Digui { //自上而下从小到大将a上的所有圆盘全部移动到b上 void hanio(int x, char a, char b, char c) { if (x == 1){ move(x, a, b); } else { hanio(x - 1, a, c, b); //将n-1个圆盘由a放到c上 move(x, a, b); //再将第n个圆盘由a放在b上 hanio(x - 1, c, b, a); //最后讲放在c上的n-1个圆盘放到b上 } } //将i上编号为n的圆盘移动到j上 void move(int x,char i,char j){ System.out.printf("将第%d个圆盘由%c移动到%c"+"\n",x,i,j); } public static void main(String args[]) { Scanner input = new Scanner(System.in); int n; Digui han = new Digui(); System.out.println("请输入第一个塔a上一共有多少个圆盘?"); n = input.nextInt(); han.hanio(n,'a','b','c'); } }
相关文章推荐
- 第一次C++作业-2
- 小学生二元四则运算(F)
- 随堂笔记160307静态代码块设计模式
- CALayer遮罩效果
- 各种排序算法(c)及时间复杂度分析
- 随堂笔记160303String
- Android-使用框架布局管理器居中显示层叠的正方形
- Velocity魔法堂系列三:模板与宿主环境通信
- 网络攻击与防范中的五种常用工具简介
- 20145304 刘钦令 Java程序设计第二周学习总结
- 输出图案题,当看到图案成对称的时候,想想绝对值。
- 随堂笔记160302OOP和String
- CALayer图片淡入淡出效果
- 记《第一行代码》读后感---Service服务
- 向下转型
- JavaScript中的对象类型详解
- 切忌浮躁、急功近利
- centos更换163网易源
- Everything For Linux
- 微信公众号开发——网页授权实现简化用户绑定