递归:
方法在方法中又调用了自己。
直接递归:自己的方法调用自己。
间接递归:自己的方法调用别的方法,别的方法又调用自己。
小结:
递归是自己调用自己。
递归如果控制的不恰当,会形成递归的死循环,从而导致栈内存溢出错误。
递归应该防止进入递归的死循环。
递归三要素
已知:f(x) = f(x-1) + 1
已知:f(1) = 1
求:f(10) = ?
计算流程:
f(10) = f(9) + 1
f(9) = f(8) + 1
f(8) = f(7) + 1
f(7) = f(6) + 1
f(6) = f(5) + 1
f(5) = f(4) + 1
f(4) = f(3) + 1
f(3) = f(2) + 1
f(2) = f(1) + 1
f(1) = 1
递归的三要素(理论) :
- 递归的终结点:f(1) = 1
- 递归的公式:f(x) = f (x-1) + 1
- 递归的方向:必须走向终结点
public static void main(String[] args) {
int f = f(10);
System.out.println(f);
}
public static int f(int n){
if (n == 1){
return 1;
}else {
return f(n -1)+1;
}
}
n的阶乘
//n 的阶乘
public static void main(String[] args) {
int f = f(10);
System.out.println(f);
}
public static int f(int n){
if (n==1){
return 1;
}else {
return n*f(n-1);
}
}
递归搜索文件实现
public static void main(String[] args) {
File file = new File("H:\\develop");
searchFile(file,"junit-4.10.jar");
}
/**
* 定义一个寻找文件路径的递归方法
* @param f file对象
* @param FileName 要想寻找的文件名
*/
public static void searchFile(File f,String FileName){
if (f.exists() && f.isDirectory()){
//提取当前文件夹下的一级文件名
File[] files = f.listFiles();
if (files!= null && files.length >0 ){
for (File file : files) {
if (file.isDirectory()){//如果是文件夹就继续递归调用
searchFile(file,FileName);
}else {
if (file.getName().contains(FileName)){
System.out.println(file.getAbsolutePath());
}
}
}
}
}
}