数据结构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 ,……
所以规律是每一个后面的值等于前两个值得和
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.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());
}
}
}