关闭

对Java中递归的再思考

标签: java递归算法Java SE
25人阅读 评论(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网站的观点或立场
    个人资料
    • 访问:430次
    • 积分:114
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档