1、方法定义中调用方法本身的现象
2、递归注意实现
        1) 要有出口,否则就是死递归
        2) 次数不能太多,否则就内存溢出
        3) 构造方法不能递归使用

3、递归解决问题的思想和图解:

 
例子1:求5的阶乘

  1. package diguidemos;
  2. /**
  3. * Created by gao on 15-12-27.
  4. */
  5. /*
  6. * 需求:请用代码实现求5的阶乘。
  7. *
  8. * 有几种方案实现呢?
  9. * A:循环实现
  10. * B:递归实现
  11. * a:做递归要写一个方法
  12. * b:出口条件
  13. * c:规律
  14. */
  15. public class DiGuiDemo01 {
  16. public static void main(String[] args) {
  17. int jc = 1;
  18. for (int i = 2; i <= 5; i++) {
  19. jc *= i;
  20. }
  21. System.out.println("5的阶乘是:" + jc); //5的阶乘是:120
  22. System.out.println("5的阶乘是:"+jieCheng(5));
  23. }
  24. /*
  25. * 做递归要写一个方法:
  26. * 返回值类型:int
  27. * 参数列表:int n
  28. * 出口条件:
  29. * if(n == 1) {return 1;}
  30. * 规律:
  31. * if(n != 1) {return n*方法名(n-1);}
  32. */
  33. public static int jieCheng(int n){
  34. if (n == 1){
  35. return 1;
  36. }else{
  37. return n * jieCheng(n-1);
  38. }
  39. }
  40. }
输出结果:
5的阶乘是:120
5的阶乘是:120
 
4、递归求阶乘的代码实现及内存图解

5、递归练习
    1)兔子问题(斐波那契数列)

  1. package diguidemos;
  2. /**
  3. * Created by gao on 15-12-27.
  4. */
  5. /*
  6. * 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
  7. * 分析:我们要想办法找规律
  8. * 兔子对数
  9. * 第一个月: 1
  10. * 第二个月: 1
  11. * 第三个月: 2
  12. * 第四个月: 3
  13. * 第五个月: 5
  14. * 第六个月: 8
  15. * ...
  16. *
  17. * 由此可见兔子对象的数据是:
  18. * 1,1,2,3,5,8...
  19. * 规则:
  20. * A:从第三项开始,每一项是前两项之和
  21. * B:而且说明前两项是已知的
  22. *
  23. * 如何实现这个程序呢?
  24. * A:数组实现
  25. * B:变量的变化实现
  26. * C:递归实现
  27. *
  28. * 假如相邻的两个月的兔子对数是a,b
  29. * 第一个相邻的数据:a=1,b=1
  30. * 第二个相邻的数据:a=1,b=2
  31. * 第三个相邻的数据:a=2,b=3
  32. * 第四个相邻的数据:a=3,b=5
  33. * 看到了:下一次的a是以前的b,下一次是以前的a+b
  34. */
  35. public class DiGuiDemo02 {
  36. public static void main(String[] args) {
  37. // 定义一个数组
  38. int[] arr = new int[20];
  39. arr[0] = 1;
  40. arr[1] = 1;
  41. for (int i = 2; i < 20; i++) {
  42. arr[i] = arr[i - 1] + arr[i - 2];
  43. }
  44. System.out.println(arr[19]); //
  45. System.out.println("-----------------");
  46. int a = 1;
  47. int b = 1;
  48. for (int i = 0; i < 18; i++) {
  49. int temp = a;
  50. a = b;
  51. b = temp + b;
  52. }
  53. System.out.println(b); //
  54. System.out.println("-----------------");
  55. System.out.println(fib(20)); //
  56. }
  57. /*
  58. * 方法: 返回值类型:int 参数列表:int n 出口条件: 第一个月是1,第二个月是1 规律: 从第三个月开始,每一个月是前两个月之和
  59. */
  60. public static int fib(int n) {
  61. if (n == 1 || n == 2) {
  62. return 1;
  63. } else {
  64. return fib(n - 1) + fib(n - 2);
  65. }
  66. }
  67. }

2)递归遍历目录下指定后缀名结尾的文件名称

  1. package diguidemos;
  2. import java.io.File;
  3. /**
  4. * Created by gao on 15-12-27.
  5. */
  6. /*
  7. * 需求:请大家把C:\workspace目录下所有的java结尾的文件的绝对路径给输出在控制台。
  8. *
  9. * 分析:
  10. * A:封装目录
  11. * B:获取该目录下所有的文件或者文件夹的File数组
  12. * C:遍历该File数组,得到每一个File对象
  13. * D:判断该File对象是否是文件夹
  14. * 是:回到B
  15. * 否:继续判断是否以.java结尾
  16. * 是:就输出该文件的绝对路径
  17. * 否:不搭理它
  18. */
  19. public class DiGuiDemo03 {
  20. public static void main(String[] args) {
  21. // 封装目录
  22. File srcFolder = new File("C:\\workspace");
  23. // 递归功能实现
  24. getAllJavaFilePaths(srcFolder);
  25. }
  26. public static void getAllJavaFilePaths(File srcFolder) {
  27. // 获取该目录下所有的文件或者文件夹的File数组
  28. File[] fileArray = srcFolder.listFiles();
  29. // 遍历该File数组,得到每一个File对象
  30. for (File file : fileArray) {
  31. // 判断该File对象是否是文件夹
  32. if (file.isDirectory()) {
  33. getAllJavaFilePaths(file);
  34. } else {
  35. // 继续判断是否以.java结尾
  36. if (file.getName().endsWith(".java")) {
  37. // 就输出该文件的绝对路径
  38. System.out.println(file.getAbsolutePath());
  39. }
  40. }
  41. }
  42. }
  43. }

3)递归删除带内容的目录

  1. package diguidemos;
  2. import java.io.File;
  3. /**
  4. * Created by gao on 15-12-27.
  5. */
  6. /*
  7. * 需求:递归删除带内容的目录
  8. *
  9. * 目录我已经给定:C:\jianzhioffer02
  10. *
  11. * 分析:
  12. * A:封装目录
  13. * B:获取该目录下的所有文件或者文件夹的File数组
  14. * C:遍历该File数组,得到每一个File对象
  15. * D:判断该File对象是否是文件夹
  16. * 是:回到B
  17. * 否:就删除
  18. */
  19. public class DiGuiDemo04 {
  20. public static void main(String[] args) {
  21. // 封装目录
  22. File srcFolder = new File("C:\\jianzhioffer02");
  23. // 递归实现
  24. deleteFolder(srcFolder);
  25. }
  26. private static void deleteFolder(File srcFolder) {
  27. // 获取该目录下的所有文件或者文件夹的File数组
  28. File[] fileArray = srcFolder.listFiles();
  29. if (fileArray != null) {
  30. // 遍历该File数组,得到每一个File对象
  31. for (File file : fileArray) {
  32. // 判断该File对象是否是文件夹
  33. if (file.isDirectory()) {
  34. deleteFolder(file);
  35. } else {
  36. System.out.println(file.getName() + "---" + file.delete());
  37. }
  38. }
  39. System.out.println(srcFolder.getName() + "---" + srcFolder.delete());
  40. }
  41. }
  42. }

Java API —— 递归的更多相关文章

  1. 【分布式】Zookeeper使用--Java API

    一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...

  2. 使用Java API操作HDFS文件系统

    使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...

  3. Hadoop 系列(三)Java API

    Hadoop 系列(三)Java API <dependency> <groupId>org.apache.hadoop</groupId> <artifac ...

  4. Elasticsearch 2.3.3 JAVA api说明文档

    原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html 翻译作者:@青山常在人不老 加入翻译:cdcnsuper ...

  5. HDFS shell操作及HDFS Java API编程

    HDFS shell操作及HDFS Java API编程 1.熟悉Hadoop文件结构. 2.进行HDFS shell操作. 3.掌握通过Hadoop Java API对HDFS操作. 4.了解Had ...

  6. Linux -- 基于zookeeper的java api(一)

    Linux -- 基于zookeeper的java api 首先启动你所有的 zkService.sh 查看状态:检查是否启动正确 [root@hu-hadoop2 ~]# zkServer.sh s ...

  7. Zookeeper java api

     Zookeeper java api 主要有以下几个: 方法名称 描述 String create(final String path, byte data[], List acl, CreateM ...

  8. HDFS Java API 的基本使用

    一. 简介 二.API的使用         2.1 FileSystem         2.2 创建目录         2.3 创建指定权限的目录         2.4 创建文件,并写入内容 ...

  9. Hadoop 学习之路(七)—— HDFS Java API

    一. 简介 想要使用HDFS API,需要导入依赖hadoop-client.如果是CDH版本的Hadoop,还需要额外指明其仓库地址: <?xml version="1.0" ...

随机推荐

  1. unity--IOC框架资料整理

    今天在网上找了一些unity资料研究,出了好多问题,编译无法通过,经人指点总算成功编译运行,做个笔记,整理如下: 一.下载unity: 二.在项目中添加Microsoft.Practices.Unit ...

  2. Flex xxx-app.xml配置

    <?xml version="1.0" encoding="UTF-8"?>  <application xmlns="http:/ ...

  3. ActiveMQ之Queue

    Queue实现的是点到点模型,在以下的例子中,启动2个消费者共同监听一个Queue,然后循环给这个Queue发送多个消息. 代码如下: public class QueueTest { /** * @ ...

  4. SSHDroid(SSH Server for Android)通过PC或命令连接android

    1.下载berserker.android.apps.sshdroid.apk .(如果你懒的下载,给我留言,我会发给你) 2.安装到手机,显示如图: 简单解释一下:一般android系统没有root ...

  5. IIS支持PHP

    1. 解压php-5.2.6.zip到D:\php5,找到php.ini-dist改名为php.ini并将它放到C:\WINDOWS目录下. 2. 将D:\ php5目录下的libmcrypt.dll ...

  6. python之range(), xrange()

    可以这样理解: range()立即执行,返回结果 xrange()延迟执行,需要时再返回结果.

  7. python之函数式编程

    python提供了支持函数式编程的简单机制: 1. map函数 2. filter函数 3. reduce函数. 典型的M/R计算模型. 但还是有点简单...

  8. IOS仿Android九宫格解锁效果[转]

    原理很简单,监听view中touch的一系列事件,当判定手指位置在某个按钮附近的时候则判断此按钮选中,并画出线. 效果图如下: 你可以在NineGridUnlockView.m文件中方法 touche ...

  9. 调皮的转义之addslashes

    背景: php自5.3版本开始废除set_magic_quotes_runtime函数,并在5.4及以后版本中移除了该函数 今天程序在向mysql插入一个serialize序列化后的数组时,由于一个数 ...

  10. 网络笔记01-2 scoket

    scoket: 1.socket /** 第一个参数(domain): 表示用什么协议 AF_INET 为IPV4开发 第二个参数(type): 表示scoket为什么类型SOCK_STREAM为TC ...