关闭

对Java中递归的再思考

标签: java递归算法Java SE
44人阅读 评论(0) 收藏 举报
分类:

古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?

程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... (斐波那契数列

采用递归来做,代码如下:

package com.gyoomi.test;

/**
 *  1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,
 *
 * @author	geyongming
 * @version	2017年9月5日 上午9:46:34
 */

public class Demo4 {
	public static void main(String[] args) {
		int i = getNum(8);
		System.out.println(i);
	}
	
	public static int getNum(int x) {
		//当x为1或2时,此时兔子的数量是1,
		//这里就是递归调用的出口
		if(x == 1 || x == 2) {
			return 1;
		}else {
			return getNum(x-1) + getNum(x-2);
		}
	}
}

再来一个例子:

问题:在控制台输出D盘上所有的文件名.

同样采用递归来做:

package com.gyoomi.test;

import java.io.File;

/**
 * 遍历D盘下的所有文件,并输出文件名
 *
 * @author	geyongming
 * @version	2017年9月6日 下午5:16:39
 */

public class Demo5 {
	public static void main(String[] args) {
		walkDisk(new File("D:\\软件包\\"));
	}
	
	public static void walkDisk(File srcFile) {
		try {
			if(srcFile.exists()) {
				//文件存在
				File[] listFiles = srcFile.listFiles();
				if(listFiles.length == 0) {
					System.out.println("文件夹为空");
				}else {
					for (File file : listFiles) {
						if(file.isDirectory()) {
							//文件夹
							walkDisk(file);
						}else {
							//文件
							//这里是出口
							System.out.println(file.getAbsolutePath()+file.getName());
						}
					}
				}
			}else {
				System.out.println("文件夹不存在");
			}
		} catch (Exception e) {
			//吞异常
			//排除系统隐藏文件夹,而且不能访问造成的异常
		}
	}
}

举一反三:

问题:每 3 个可乐盖可兑换 1 瓶子可乐,求买 n 瓶可乐最终可获得的可乐瓶子数。

分析:出口是当时3的倍数的时候返回除以3个可乐瓶子

代码如下:

package com.gyoomi.test;

/**
 * 问题:每 3 个可乐盖可兑换 1 瓶子可乐,求买 n 瓶可乐最终可获得的可乐瓶子数。
 *
 * @author	geyongming
 * @version	2017年9月6日 下午5:41:20
 */

public class Demo6 {
	public static void main(String[] args) {
		int i = getCola(10);
		System.out.println("获奖的可乐数量是:" + i);
	}
	
	public static int getCola(int x) {
		if(x % 3 == 0) {
			//出口
			return x/3;
		}else {
			return getCola(x - 1);
		}
	}
}


发现:通过以上例子发现,递归最重要的就是找到程序出口,有人说是入口和出口,但是我认为我觉得只要找到了程序的出口,就找到递归的关键,剩下的就是套模板就行了.

当你理解了出口之后,在此基础之上,在将其应用到项目上,理清项目中哪些是要作为判断条件的,哪些是程序的出口,就会轻而易举的在项目中使用递归.


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

对于二叉树三种非递归遍历方式的理解

利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回);因此,基于其的二叉树遍历操作深刻的体现了其特性: 1.先入、后出,只...
  • sdulibh
  • sdulibh
  • 2016-01-24 11:25
  • 1228

蓝桥杯常用算法知识点:【递归】求n个元素的全排列

package com.aiqiongdiao; public class Main { /** * 【递归】求n个元素的全排列 * abc acb bac bca cab cba *...
  • qq_30258957
  • qq_30258957
  • 2016-03-15 15:41
  • 1790

写递归函数的正确思维方法

递归是编程中一个相对难以理解但是却又很重要的概念. 对于从命令式语言开始学习编程的程序员天生对此有理解缺陷, 而对于从类似C++这种对函数式编程范式不友好的语言开始学习编程的程序员就更加如此了.(比如...
  • vagrxie
  • vagrxie
  • 2013-01-05 21:04
  • 66210

【Java】求1-100范围内的素数递归方法

  • 2017-11-11 14:17
  • 356B
  • 下载

java培训知识-递归

  • 2013-08-28 19:00
  • 43KB
  • 下载

tree easyui java 树递归

  • 2015-04-09 19:01
  • 13.65MB
  • 下载

java线程中的递归

  • 2015-04-12 21:47
  • 209KB
  • 下载

java递归的排序和查找,数组栈.....

  • 2010-06-04 13:05
  • 227KB
  • 下载

Hanoi塔递归演示系统 为数据结构课程做CAI演示系统 java 源码 毕业设计 论文

  • 2010-06-03 00:08
  • 259KB
  • 下载

java递归实现树(Tree)

  • 2013-12-25 23:36
  • 1KB
  • 下载
    个人资料
    • 访问:2277次
    • 积分:376
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:8篇
    • 译文:0篇
    • 评论:0条
    文章分类