对Java中递归的再思考
来源:互联网 发布:盐城龙卷风 知乎 编辑:程序博客网 时间:2024/06/06 16:33
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
程序分析:
采用递归来做,代码如下:
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);}}}
发现:通过以上例子发现,递归最重要的就是找到程序出口,有人说是入口和出口,但是我认为我觉得只要找到了程序的出口,就找到递归的关键,剩下的就是套模板就行了.
当你理解了出口之后,在此基础之上,在将其应用到项目上,理清项目中哪些是要作为判断条件的,哪些是程序的出口,就会轻而易举的在项目中使用递归.
阅读全文
0 0
- 对Java中递归的再思考
- 对递归的思考
- 对java中random的思考
- 对 Java 中 clone 方法的思考
- 对Java基本数据类型的再思考
- 对《JAVA编程思想》中一段代码的思考
- 我对JAVA中一个多线程程序的思考
- Java中对变量范围转换引发的思考
- F# 中关于递归的思考
- 对思考的思考
- 对LSTM中M(Memory)的再思考
- Java实现对二叉树前序/中序/后序的递归与非递归算法
- 对silverlight中DoubleAnimation的思考
- 对JavaScript开发中困扰的思考
- 对JavaScript开发中困扰的思考
- 头文件中对extern的思考
- 工作中对“快速阅读”的思考
- 对Java8中distinct()的思考
- 网页前端CSS之选择器
- 第一个android项目开发日志(1)
- 用Qt Creator编译opencv并配置开发环境
- [Android Exercise]仿微信游戏界面PART.1—ConstraintLayout和RecyclerView的应用
- 使用mmenu制作侧边抽屉菜单
- 对Java中递归的再思考
- git checkout v4.12
- JAVA用UDP实现通信
- CentOS 6.7 Linux系统下 安装redis3.0.7
- 领域模型驱动设计(Domain Driven Design)入门概述
- bzoj1295 [SCOI2009]最长距离(spfa)
- jdk update 和 jdk SE Developer Kit的区别
- java:常见加密解密算法的实现:MD5/SHA/HMAC/DES/PBE/AES/RSA/D-H
- MySQL中explain命令的type指标讲解