连云港建设网站/百度首页广告
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
程序分析:
采用递归来做,代码如下:
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);}}
}
发现:通过以上例子发现,递归最重要的就是找到程序出口,有人说是入口和出口,但是我认为我觉得只要找到了程序的出口,就找到递归的关键,剩下的就是套模板就行了.
当你理解了出口之后,在此基础之上,在将其应用到项目上,理清项目中哪些是要作为判断条件的,哪些是程序的出口,就会轻而易举的在项目中使用递归.