`

递归详解

 
阅读更多

      所谓递归(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);
	}

}

 

最后打印出来的结果如下:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics