对Java中递归的再思考

来源:互联网 发布:盐城龙卷风 知乎 编辑:程序博客网 时间:2024/06/06 16:33

古典问题:有一对兔子,从出生后第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, * * @authorgeyongming * @version2017年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盘下的所有文件,并输出文件名 * * @authorgeyongming * @version2017年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 瓶可乐最终可获得的可乐瓶子数。 * * @authorgeyongming * @version2017年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);}}}


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

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