递归:Recursion,在函数定义中又调用了自身。基本上所有递归问题都可以使用递推公式来表示!
1、满足递归的条件:
(1)、一个问题的解能够拆分为多个子问题的解,并且子问题与该问题除了在数据规模上不同,求解思路完全相同。【递推式】
(2)、有递归出口,否则会死循环。
2、递归存在的两大问题:
(1)、堆栈溢出。使用递归会借用系统栈,每次调用时进栈,直到满足递归终止条件才出栈。而系统栈(虚拟机栈)空间一般不大,当递归调用层数很深时,会有栈溢出的风险。
(2)、重复计算。【递归+记忆数组可以解决重复计算问题----->动态规划算法时再讲!】
3、循环和递归:循环都可以改写成递归,但递归不一定能改成循环。但是递归空间复杂太高,存在堆栈溢出风险、重复计算太多,因此最好能用迭代循环方式将递归改为非递归形式!!!
4、递归应用:
1、阶乘问题:
// 当n足够大时:int--->BigInteger--->数组/字符串【大数相乘(分治法章节再讲)】
public BigInteger factorial(int n) {
if (n == 0) {
return BigInteger.ONE;
}
return BigInteger.valueOf(n).multiply(factorial(n - 1));
}
2、目录拷贝:【涉及文件操作、流IO】
/**
* 将source下所有文件拷贝到target目录下
*
* @param source:源目录
* @param target:目的目录
*/
public void copyDir(File source, File target) {
if (source.isFile() || !source.exists()) {
return;
}
File newDir = new File(target, source.getName());
newDir.mkdir();
File[] files = source.listFiles();
FileInputStream fis = null;
BufferedOutputStream buffer = null;
for (File file : files) {
if (file.isFile()) {// 是文件直接拷贝
// 字节流
try {
fis = new FileInputStream(file);
buffer = new BufferedOutputStream(new FileOutputStream(new File(newDir, file.getName())));
int len = 0;
byte bytes[] = new byte[1024];
while ((len = fis.read(bytes)) != -1) {
buffer.write(bytes, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (buffer != null) {
try {
buffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} else {
copyDir(file, newDir);
}
}
}
更多递归在分治、动态规划等算法讲解
/*
* 文件操作:
* 1、listFiles()返回目录下的所有文件和目录,即File[]数组。
* 2、list()返回目录下的所有文件和目录名,即String[]数组。
* 3、delete()删除文件或目录,注意当目录下还有文件时不能删除!
* 4、createNewFile()创建文件 mkdir()创建目录
* 5、isFile()/isDirector()判断是文件还是目录
*/
public static void doFile() {
File delfile = new File("F:/数据备份");
File[] files = delfile.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println(files[i].getName());
if (files[i].isDirectory()) {
files[i].delete();
}
}
String[] list = delfile.list();
for (String strFile : list) {
System.out.println(strFile);
}
}