黑马程序员技术交流社区

标题: 递归 简单题 [打印本页]

作者: 心语来了    时间: 2015-12-21 23:16
标题: 递归 简单题
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
* 分析:我们要想办法找规律
*    兔子对数
* 第一个月:  1
* 第二个月: 1
* 第三个月: 2
* 第四个月: 3
* 第五个月: 5
* 第六个月: 8
* ...
*
* 由此可见兔子对象的数据是:
*   1,1,2,3,5,8...
* 规则:
*   A:从第三项开始,每一项是前两项之和
*   B:而且说明前两项是已知的
*
* 如何实现这个程序呢?
*   A:数组实现
*   B:变量的变化实现
*   C:递归实现
*
* 假如相邻的两个月的兔子对数是a,b
* 第一个相邻的数据:a=1,b=1
* 第二个相邻的数据:a=1,b=2
* 第三个相邻的数据:a=2,b=3
* 第四个相邻的数据:a=3,b=5
* 看到了:下一次的a是以前的b,下一次是以前的a+b
*/
public class DiGuiDemo2 {
public static void main(String[] args) {
  // 定义一个数组
  int[] arr = new int[20];
  arr[0] = 1;
  arr[1] = 1;
  // arr[2] = arr[0] + arr[1];
  // arr[3] = arr[1] + arr[2];
  // ...
  for (int x = 2; x < arr.length; x++) {
   arr[x] = arr[x - 2] + arr[x - 1];
  }
  System.out.println(arr[19]);// 6765
  System.out.println("----------------");
  int a = 1;
  int b = 1;
  for (int x = 0; x < 18; x++) {
   // 临时变量存储上一次的a
   int temp = a;
   a = b;
   b = temp + b;
  }
  System.out.println(b);
  System.out.println("----------------");
  System.out.println(fib(20));
}
/*
  * 方法: 返回值类型:int 参数列表:int n 出口条件: 第一个月是1,第二个月是1 规律: 从第三个月开始,每一个月是前两个月之和
  */
public static int fib(int n) {
  if (n == 1 || n == 2) {
   return 1;
  } else {
   return fib(n - 1) + fib(n - 2);
  }
}
}

package cn.itcast_03;
import java.io.File;
/*
* 需求:递归删除带内容的目录
*
* 目录我已经给定:demo
*
* 分析:
*   A:封装目录
*   B:获取该目录下的所有文件或者文件夹的File数组
*   C:遍历该File数组,得到每一个File对象
*   D:判断该File对象是否是文件夹
*    是:回到B
*    否:就删除
*/
public class FileDeleteDemo {
public static void main(String[] args) {
  // 封装目录
  File srcFolder = new File("demo");
  // 递归实现
  deleteFolder(srcFolder);
}
private static void deleteFolder(File srcFolder) {
  // 获取该目录下的所有文件或者文件夹的File数组
  File[] fileArray = srcFolder.listFiles();
  if (fileArray != null) {
   // 遍历该File数组,得到每一个File对象
   for (File file : fileArray) {
    // 判断该File对象是否是文件夹
    if (file.isDirectory()) {
     deleteFolder(file);
    } else {
     System.out.println(file.getName() + "---" + file.delete());
    }
   }
   System.out
     .println(srcFolder.getName() + "---" + srcFolder.delete());
  }
}
}


package cn.itcast_03;
import java.io.File;
/*
* 需求:请大家把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台。
*
* 分析:
*   A:封装目录
*   B:获取该目录下所有的文件或者文件夹的File数组
*   C:遍历该File数组,得到每一个File对象
*   D:判断该File对象是否是文件夹
*    是:回到B
*    否:继续判断是否以.java结尾
*     是:就输出该文件的绝对路径
*     否:不搭理它
*/
public class FilePathDemo {
public static void main(String[] args) {
  // 封装目录
  File srcFolder = new File("E:\\JavaSE");
  // 递归功能实现
  getAllJavaFilePaths(srcFolder);
}
private static void getAllJavaFilePaths(File srcFolder) {
  // 获取该目录下所有的文件或者文件夹的File数组
  File[] fileArray = srcFolder.listFiles();
  // 遍历该File数组,得到每一个File对象
  for (File file : fileArray) {
   // 判断该File对象是否是文件夹
   if (file.isDirectory()) {
    getAllJavaFilePaths(file);
   } else {
    // 继续判断是否以.java结尾
    if (file.getName().endsWith(".java")) {
     // 就输出该文件的绝对路
     System.out.println(file.getAbsolutePath());
        }
      }
    }
  }
}




作者: redsifei    时间: 2015-12-21 23:18
挺不错啊 有长进了
作者: guoguo291    时间: 2015-12-21 23:19
加油  顶一个  继续努力
作者: 心语来了    时间: 2015-12-21 23:21
谢谢两位学长 这么长时间的帮助
作者: 意念痴心灬戒贪    时间: 2015-12-22 00:06
不错   赞一个~!
作者: 很急很关键    时间: 2015-12-22 23:05
加油加油   不错ha
作者: 744919632    时间: 2015-12-22 23:07
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
public class Prog1{
        public static void main(String[] args){
                int n = 10;
                System.out.println("第"+n+"个月兔子总数为"+fun(n));
        }
        private static int fun(int n){
                if(n==1 || n==2)
                   return 1;
                else
                   return fun(n-1)+fun(n-2);
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2