递归思想:
函数自身直接或者间接的调用到了自身。一个功能在被重复使用,并每次使用时,参与运算的结果和上一次调用有关。 这时可以用递归来解决问题。
注意:
1,递归一定明确条件。否则容易死循环。
2,注意一下递归的次数。太多的话影响效率。
如求1~某整数之间的各个整数的和,可以用递归思想这样编程
public static int getSum(int num){
if(num==1)
return 1;
return num+getSum(num-1); //递归
}
递归思想的应用:深度遍历文件夹。
因为深度遍历要一层一层的调用同样的方法并作同样的判断,所以就用递归最好。同样删除文件夹时也要层层遍历从最里面开始删除,也用递归较好。例如以下的类定义了遍历并打印和删除的方法:
class Traverse {
public static void removeall(File f){
if(f.isDirectory()){ //判断是否是目录
File[] farr=f.listFiles();
for(int i=0;i<farr.length;i++){ //遍历当前目录
removeall(farr[i]); //递归,调用了函数本身自己
}
System.out.println(f+":"+f.delete()); //删除文件夹
}
else{
System.out.println(f+":"+f.delete()); //是文件,则直接删除
}
}
public static void listAll(File f) { //定义深度遍历方法
TraverselistAll(f, 0);
}
private static void TraverselistAll(File f, int level) { //深度便利方法具体体现
System.out.println(getSpace(level) + f.getName());
不管是不是目录,先打印出来
if (f.isDirectory()) {
level++;
File[] farr = f.listFiles();
for (int i = 0; i < farr.length; i++) {
TraverselistAll(farr[i], level); //递归,调用了自身
}
}
}
private static String getSpace(int level) { //这个是为了打印好看,形成分支结构的函数
StringBuilder sb = new StringBuilder();
sb.append("|--");
for (int i = 0; i < level; i++) {
sb.insert(0, " ");
}
return sb.toString();
}}