所谓递归(Recursion),就是方法调用自身,对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环。编写一个递归程序,应先想出口点。
1,下面使用阶乘这个数学概念来实践一下阶乘。
阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。
例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。
下面的代码就是使用递归来实现阶乘---不断地调用number方法,注:下例暂不考虑负数
package com.test.Algorithm;
public class Factorial {
public static int number(int i){
if(i == 1 || i == 0){ //递归的出口
return 1;
}else{
return i * number(i-1);
}
}
public static void main(String[] args) {
System.out.println(number(4));
}
}
2,再来看一个使用递归计算斐波那契数列的例子:
斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、……
这个数列从第三项开始,每一项都等于前两项之和。
package com.test.Algorithm;
public class Fab {
//使用递归计算斐波那契数列
public static int compute(int i){
//递归的出口
if(i == 1 || i == 2){
return 1;
}else{
return compute(i-1) + compute(i-2);
}
}
public static void main(String[] args) {
System.out.println(compute(9));
}
}
3,下面再使用递归来删除一个文件夹内的所有文件
package com.test.Algorithm;
import java.io.File;
public class FileTest9 {
public static void delAll(File file){
//递归出口,判断是否文件或空文件夹
if(file.isFile() || file.list().length == 0){
file.delete();
}else{
File[] files = file.listFiles();
for(File f: files){
delAll(f);
}
file.delete();
}
}
public static void main(String[] args) {
File file = new File("D:/test");
delAll(file);
}
}
4,给定任意一个目录,以树形方式展示出该目录的所有子目录与文件,另外,在展现的时候,将目录排在上面,文件排在下面,每一层要加上缩进,以递归实现。
package com.test.Algorithm;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class FileTest11 {
private static int time = 0;
public static void deepList(File file) {
if (file.isFile() || file.list().length == 0) {
return;
} else {
File[] files = file.listFiles();
files = sort(files);
for (File f : files) {
StringBuffer output = new StringBuffer();
if (f.isFile()) {
output.append(getTabs(time));
output.append(f.getName());
} else {
output.append(getTabs(time));
output.append(f.getName());
output.append("\\");// "\"表示是目录
}
System.out.println(output);
if (f.isDirectory()) {
time++;
deepList(f);
time--;
}
}
}
}
// 整理文件数组,使得目录排在文件前面
private static File[] sort(File[] files) {
ArrayList<File> sorted = new ArrayList<File>();
// 先寻找所有的目录
for (File f : files) {
if (f.isDirectory()) {
sorted.add(f);
}
}
// 再寻找所有的文件
for (File f : files) {
if (f.isFile()) {
sorted.add(f);
}
}
return sorted.toArray(new File[files.length]);
}
private static String getTabs(int times) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < times; i++) {
buffer.append("\t");
}
return buffer.toString();
}
public static void main(String[] args) throws IOException {
File f = new File("C:/test");
deepList(f);
}
}
最后打印出来的结果如下: