转: JAVA递归算法实例小结
一、递归算法设计的基本思想是:
对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。
在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。
关键要抓住的是:
(1)递归出口
(2)地推逐步向出口逼近
二、递归算法实例
(1)阶乘:
要求:给定一个数值,计算出它的阶乘值,例如5的阶乘为5*4*3*2*1
实现:
- <span style="font-size:12px;"> // 利用递归实现一个数的阶乘值
- private static BigDecimal getNum(BigDecimal inNum) {
- if (inNum.compareTo(BigDecimal.ONE) == 0) {
- return inNum;
- }
- return inNum.multiply(getNum(inNum.subtract(BigDecimal.ONE)));
- }</span>
(2)Fibonacci数列:1,1,2,3,5,8,13……
要求:找出数列中指定index位置的数值
实现:
- <span style="font-size:12px;"> // 利用递归实现了Fibonacci数列
- private static int fab(int index) {
- if (index == 1 || index == 2) {
- return 1;
- } else {
- return fab(index - 1) + fab(index - 2);
- }
- }</span>
(3)汉诺塔
要求:汉诺塔挪动
实现:
- <span style="font-size:12px;"> <span style="white-space:pre"> </span>private static final String DISK_B = "diskB";
- <span style="white-space:pre"> </span>private static final String DISK_C = "diskC";
- <span style="white-space:pre"> </span>private static final String DISK_A = "diskA";
- <span style="white-space:pre"> </span>static String from=DISK_A;
- <span style="white-space:pre"> </span> static String to=DISK_C;
- <span style="white-space:pre"> </span> static String mid=DISK_B;
- <span style="white-space:pre"> </span> public static void main(String[] args) {
- <span style="white-space:pre"> </span> String input=JOptionPane.showInputDialog("please input the number of the disks you want me move.");
- <span style="white-space:pre"> </span> int num=Integer.parseInt(input);
- <span style="white-space:pre"> </span> move(num,from,mid,to);
- <span style="white-space:pre"> </span> }</span>
- <span style="font-size:12px;"> // 利用递归实现汉诺塔
- private static void move(int num, String from2, String mid2, String to2) {
- if (num == 1) {
- System.out.println("move disk 1 from " + from2 + " to " + to2);
- } else {
- move(num - 1, from2, to2, mid2);
- System.out.println("move disk " + num + " from " + from2 + " to " + to2);
- move(num - 1, mid2, from2, to2);
- }
- }</span>
(4)排列组合
要求:将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc",
则程序会输出
abc
acb
bac
bca
cab
cba
实现:
- <span style="font-size:12px;"><span style="white-space:pre"> </span>public static void permute(String str) {
- <span style="white-space:pre"> </span> char[] strArray = str.toCharArray();
- <span style="white-space:pre"> </span> permute(strArray, 0, strArray.length - 1);
- <span style="white-space:pre"> </span>}</span>
- <span style="font-size:12px;"> // 利用递归实现,将输入的一个字符串中的所有元素进行排序并输出
- public static void permute(char[] list, int low, int high) {
- int i;
- if (low == high) {
- String cout = "";
- for (i = 0; i <= high; i++) {
- cout += list[i];
- }
- System.out.println(cout);
- } else {
- for (i = low; i <= high; i++) {
- char temp = list[low];
- list[low] = list[i];
- list[i] = temp;
- permute(list, low + 1, high);
- temp = list[low];
- list[low] = list[i];
- list[i] = temp;
- }
- }
- }</span>
总结递归算法来说,这个根就是那个出口,只要找到这个出口所在,那么算法自然而然就能水到渠成了。
参考资料一:http://blog.csdn.net/lfsf802/article/details/7696405
参考资料二、http://nevergives.blog.sohu.com/95934843.html
转: JAVA递归算法实例小结的更多相关文章
- JAVA RMI 实例
下面我将介绍一个完整的实例,让初学者能快速体验RMI的功用. 分为以下四个步骤 1. 创建远程接口及声明远程方法(HelloInterface.java)2. 实现远程接口及远程方法(继承Unicas ...
- Java多线程-实例解析
Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...
- Thrift入门初探--thrift安装及java入门实例
什么是thrift? 简单来说,是Facebook公布的一款开源跨语言的RPC框架. 那么问题来了. 什么是RPC框架? RPC全称为Remote Procedure Call,意为远程过程调用. 假 ...
- java并发包小结(二)
接上一篇 java并发包小结(一):http://blog.csdn.net/aalansehaiyang52/article/details/8877579 Future 接口Future 接口允许 ...
- [Java初探实例篇02]__流程控制语句知识相关的实例练习
本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...
- 【thrift】thrift入门初探--thrift安装及java入门实例
转载:https://www.cnblogs.com/fingerboy/p/6424248.html 公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门 ...
- Redis缓存Mysql模拟用户登录Java实现实例[www]
Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...
- java IO 流小结
java IO 流小结 java流类图结构 流的分类 按方向 输入流 输出流 按类型 字节流 字符流 结论:只要是处理纯文本数据,就优先考虑使用字符流. 除此之外都使用字节流.
- Flex Socket与Java通信实例说明(转)
Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...
随机推荐
- 【前端】Web前端学习笔记【2】
[2016.02.22至今]的学习笔记. 相关博客: Web前端学习笔记[1] 1. this在 JavaScript 中主要有以下五种使用场景 在全局函数调用中,this 绑定全局对象,浏览器环境全 ...
- 阅读笔记 火球——UML大战需求分析 2
从大一一开始接触C++的时候,上课模模糊糊的听王辉老师讲,我们第一学期学的是面向过程,第二学期学的是面向对象,迷迷糊糊的上了一年,到了大二的时候,对这个面向什么没有什么深层次的理解.知道学了JAVA ...
- 首师大附中科创教育平台 我的刷题记录 3120 LJX的校园:入学典礼
今天给大家献上"C"级题:LJX的校园:入学典礼!! 试题编号:3120 LJX的校园:入学典礼 难度级别:C: 运行时间限制:45ms: 运行空间限制:256000K ...
- OpenCV2+入门系列(三):遍历图像的几种方法
根据OpenCV中Mat类型的结构和内存中存储方式,此处给出三种对图像进行遍历的方法.首先给出基础的读取图片代码,在中间替换三种遍历方法即可,本文中,程序将遍历图像并将所有像素点置为255,所有运行结 ...
- 《与小卡特一起学Python》Code1
print "I love pizza!" print "pizza " * 20 print "yum " * 40 print &quo ...
- 个人博客作业Week1
个人博客作业Week1 一.问题 通读<构建之法>我有一下几个问题 PM没有参与代码编如何进行管理. 软件工程师的职业资格考试对我们来说很有必要吗. 当我们为用户开发软件时我们需要了解用户 ...
- [地图SkyLine二次开发]框架(3)
上节将显示我们地图的OBJECT控件,布了一下局,但地图没有进行加载. 这是因为我们要在另一个页面,对OBJECT控件进行地图加载,并且得到该控件的sgworld,以便对其进行我们想要的开发. 这里, ...
- PHP的基本排序算法
1 冒泡排序 <?php /** * 冒泡排序(从小到大) * 基本思想:两两比较相邻记录,一次循环确定一个数 * 在所有的排序算法中是最慢的,尤其当数据量较大的时候,数据小体现不出来 */ $ ...
- 常用SVN命令
SVN命令 svn co svn://10.144.156.41/branches/webroot_2015_03_03_gift 表示check远程目录到当前目录下,co命令只能check目录,如 ...
- PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第一组(转)
两个PPT结合起来--一些基础介绍--每一步的详细细节还要去研读文档 EMV-全球标准PBOC-国内标准 ----------------------一:必选:应用选择应用选择的方法:目录选择法.AI ...