递归的分类:
- 直接递归:方法自身调用自己
- 间接递归:A方法调用B方法,B方法调用C方法,C方法调用A方法
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
- 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
- 构造方法禁止递归(构造方法是创建对象使用的,一直递归会导致内存有无数多个对象)
//使用递归计算1~n之间的和
public int sum(int n){
if(n==1){
return 1;
}
return n + sum(n-1);
}
//递归计算阶乘
public int jc(int n){
if(n == 1){
return 1;
}
return n * jc(n-1);
}
//递归打印多级目录
File file = new File("C:\\Java");
getAllFile(file);
public void getAllFile(File dir){
File[] files = dir.listFiles();
for(File f : files){
if(f.isDirectory()){
getAllFile(f);
}else{
//查找以java结尾的文件
String name = f.getName();
boolean b = name.endsWith(".java");
if(b){
System.out.println(f);
}
}
}
}
public void getAllFile(File dir){
//传递过滤器对象使用匿名内部类
File[] files = dir.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname){
//过滤规则,pathname是文件夹或者是.java结尾的文件返回true
return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
}
});
//或者
File[] files = dir.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir,String name){
reutrn new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
}
})
for(File f : files){
if(f.isDirectory()){
getAllFile(f);
}else{
System.out.println(f);
}
}
}