数据结构04之递归

递归是一种算法简单来说就是自身调用自身,当然如果没有判断的调用的话,就是死循环会给程序带来致命的伤!

第一次接触应该就是兔子生兔子的问题,是c里面的一道题!

递归是一种思想,实现也没有什么好说的根据不同的问题去实现就好!

   如果一对兔子每月能生一对小兔子,而每对小兔在它出生后的第 3 个月里,又能开始生一对小兔子,假定在不发生死亡的情况下,由一对初生的兔子开始,一年后能繁殖成多少对兔子?

   推算一下兔子的对数是很有意思的。为了叙述得有条理,我们假设最初的一对兔子出生在头一年的 12 月份。显然, 1 月份只有一对兔子,到 2 月份时,这对兔子生了 1 对小兔子,总共 2 对兔子;在 3 月份里,这对兔子又生了一对小兔,总共 3 对兔子;到 4 月份, 2 月份生的兔子开始生小兔了,这个月生了 2 对小兔,所以总共 5 对兔子;在 5 月份里,不仅最初的那对兔子和 2 月份出生的兔子各生了一对小兔, 2 月份出生的兔子也生了 1 对小兔,总共出生了 3 对兔子,所以总共 8 对兔子……。

   照这样推算下去,当然能得到题目的答案,不过,斐波拉契对这种算法很不满意,他觉得这种方法太繁琐了而且推算到最后情况复杂,稍有不慎就会出现差错。于是他又深入探索了题目中的数量关系,终于找到了一种简捷的解题方法。

斐波拉契把推算得到的头几个数摆成一串。

1 , 1 , 2 , 3 , 5 , 8 ,…… 

所以规律是每一个后面的值等于前两个值得和  

public int rabbitNum(int n ) {


                if(n == 1)

                      return 1;

               else{

                     return rabbitNum(n-1) + rabbitNum(n-2);

                    }

}

public static void main(String[] args) 
{
   System.out.println(rabbitNum(8));
}

 

 所以当我们求第8个月的时候它会先进入方法con然后往前推知道第一个,然后每次往前推都执行con(n - 1) + con(n - 2);也就是前两个值得和最后当n不大于2也就是第一个的时候,前面所有的两两相加已经完成最终会返回总值

 

 下面是找出一个文件夹的所有文件及文件夹,给一个入口文件(夹),如果是文件夹得到file.list()并输出文件夹名并递归继续查找,不是则输出文件名


import java.io.File;

import java.io.FileNotFoundException;
public class FileRead {
    public static void main(String[] args) throws FileNotFoundException {
        new FileRead().readDirectoryAndFile("D:\\work");
    }
    
    public void readDirectoryAndFile(String filepath) throws FileNotFoundException{
         try {

              File file = new File(filepath);
              if (file.isDirectory()) {
                  String[] filelist = file.list();
                  System.out.println("Directory_name =   "+ file.getName());
                  for (int i = 0; i < filelist.length; i++) {
                      File readfile = new File(filepath + "\\" + filelist[i]);
                      if (file.isDirectory())
                          readDirectoryAndFile(filepath + "\\" + filelist[i]);
                  }
              }
              else {
                    System.out.println("File_name =        " + file.getName());
                  }
            }
            catch (FileNotFoundException e) {
              System.out.println("readDirectoryAndFile()   Exception:" + e.getMessage());
            }
    }
}

posted @ 2012-04-12 15:25  _公孓℡  阅读(132)  评论(0编辑  收藏  举报