什么是递归呢?简单地说,就是函数自身调用自身的过程!让我们看一个简单的例子,在我们初学Java的时候,老师要求我们怎么去获取十进制整数的二进制表现形式,如:求6的二进制形式,那么一开始我们写的代码可能是这样的:
public static void toBin(int num){
while(num>0){
System.out.print(num%2);
num = num /2;
}
}
当被函数调用时,传入参数为6时,打印结果为:011,是二进制的反转打印形式。现在我们就以这个球二进制的表现形式
public static void toBin2(int num){
if(num>0){
toBin2(num/2);//再次调用自身
System.out.println(num%2);
}
}
通过函数自身调用自身来求十进制6的二进制表现形式:110。函数自身调用自身内存中变现形式是什么样子的呢?
通过上面函数递归调用内存图解可以看出:函数的递归形式是在函数中调用函数自身的形式,来保证未满足条件的程序继续执行!函数的递归作用还表现在求和的递归中,那么用递归函数求1~n的累加求和怎么实现呢??
public static int getSum(int n ){
if(n==1)
return 1;
return n +getSum(n-1);
}
来看一下求1~3的函数内存图解:
通过上面的递归可以实现求1~3的和。你也许可以看出函数递归的一些特点了,函数每一次递归其实都是在内存中,具体可以说是栈中调用函数入栈执行,递归多少次就会在内存中开辟多少块空间。
递归的使用需要注意事项:
1、限定递归的条件。
2、需要注意递归的次数,尽量避免内存溢出。
递归的使用在Java中应用很多,譬如在IO技术中。让我们看一个需求,怎么用递归实现。
需求:获取给定目录下所有的.java文件(包含子目录),把所获取到的.java文件的路径写入到一个文件中
package com.io.com;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
/**
* 需求:获取给定目录下所有的.java文件(包含子目录),把所获取到的.java文件的路径写入到一个文件中
*
*
*
*/
public class getJavaFileListDemo {
public static void main(String[] args) {
//指定源,即指定目录对象
File dir = new File("E:\\JavaSoft\\Eclipse_workspace");
//指定目的地,列表清单
File list = new File("file");
try {
getJavaFileList(dir,list);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void getJavaFileList(File dir,File list) throws IOException{
if (!dir.exists())
throw new RuntimeException("指定的目录不存在!");
//获取给定目录下所有文件对象
File [] files = dir.listFiles();
//通过循环判断,每一文件是文件或是目录
for (File file : files) {
if (file.isFile()) {
if (file.getName().endsWith(".java")) {
//创建输出流对象
FileOutputStream fos = new FileOutputStream(list,true);//采用续写的方式
//获取文件的路径,实现跨行
String path = file.getAbsolutePath()+System.getProperty("line.separator");
//把文件的绝对路径转为自节后写入到文件中
fos.write(path.getBytes());
fos.close();//释放资源
}
}else if(file.isDirectory()){
//如果是文件夹,继续调用自身
getJavaFileList( file, list);
}
}
}
}
上面这个程序通过递归调用自身,来实现搜索子目录下的所有.java文件,再通过IO流写入一个指定的文件中!递归的应用范围很广,但要记得递归函数的使用注意两个点:
1、限定递归的条件。
2、需要注意递归的次数,尽量避免内存溢出。