递归(Recursion),就是方法调用自身。
对于递归来说,一定有一个出口,让递归结束,只有这样才能保证不出现死循环。
递归计数器:
private static int time;
public static void recursion()
{
time++;
recursion();
time--;
}
一个简单的递归实例:阶乘
public static int factorial(int number)
{
int result;
if(number == 1) //递归出口
{
result = 1;
}
else
{
result = number * factorial(number - 1);
}
return result;
}
删除当前目录及其子目录下所有文件和目录
public static void deleteAll(File file)
{
if(file.isFile() || file.list().length == 0) //递归出口
{
file.delete();
}
else
{
File[] files = file.listFiles();
for(File f : files)
{
deleteAll(f);
f.delete(); //删除最后的空目录
}
}
}
列出当前目录及子目录的所有文件及目录
/*粗略的版本*/
public static void listAll(File file)
{
//递归出口,file为文件或空目录时打印出filename
if(file.isFile() || file.list().length == 0)
{
System.out.println(file.getName());
}
else
{
//先打印父目录
System.out.println(file.getName());
File[] files = file.listFiles();
for(File f : files)
{
listAll(f);
}
}
}
/*带Tab格式的排序的版本*/
//用于判断目录或文件所处的层次
private static int time;
public static void listAll(File file)
{
if(file.isFile() || file.list().length == 0)
{
System.out.println(getTabs(time) + file.getName() + (file.isFile() ? "" : "\\"));
}
else
{
System.out.println(getTabs(time) + file.getName() + "\\");
File[] files = file.listFiles();
sort(files);
for(File f : files)
{
time++;
listAll(f);
time--;
}
}
}
//判断需要加多少 tab的方法
private static String getTabs(int time)
{
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < time; i++)
{
buffer.append("\t");
}
return buffer.toString();
}
// 整理文件,使得目录排在文件之前
private static void 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);
}
}
files = sorted.toArray(new File[files.length]);
}