递归算法
定义:
定义方法时,在方法内部调用方法本身,称之为递归。
例:
public void test(){
System.out.println("断剑重铸之日,骑士归来之时");
test();
}
作用:
它通常把一个大型复杂的问题,层层转换为一个与原问题相似的,规模较小的问题来求解。递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
注意事项:
在递归中,不能无限制的调用自己,必须要有边界条件,能够让递归结束,因为每一次递归调用都会在栈内存开辟新的空间,重新执行方法,如果递归的层级太深,很容易造成栈内存溢出。
递归的使用
1、求阶乘:
分析:
1! = 1
2! = 2*1 = 2*1!
3! = 3*2*1 = 3*2!
4! = 4*3*2*1 = 4*3!
n! = n*(n-1)*(n-2)...*2*1 = n*(n-1)!
代码实现:
public static void main(String[] args) {
//求3的阶乘
int factorial= factorial(3);
System.out.println(factorial);
}
// 递归求阶乘
public static int factorial(int i) {
int result = 0;
if (i >= 0) {
if (i == 0) {
result = 1;
} else {
result = i * factorial(i - 1);
return result;
}
}
return result;
}
2、斐波那契数列:
定义:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
这个数列从第3项开始,每一项都等于前两项之和。
代码实现:
public class Recursive {
public static void main(String[] args) {
int fib = fib(5);
System.out.println(fib);
}
// 斐波那契数列 0 1 1 2 3 5 8 13 21 34 前两项之和等于后一项(从1开始)
public static int fib(int index) {
int result = 0;
if (index >= 0) {
if (index == 0) {
result = 0;
} else if (index == 1) {
result = 1;
} else {
result = fib(index - 1) + fib(index - 2);
return result;
}
}
return result;
}
}
3、对文件夹的操作(统计大小和删除文件夹):
public class TestFile03 {
public static void main(String[] args) {
File file = new File("E:\\test");
long fileLength = getFileLength(file);
System.out.println(fileLength);
}
public static long getFileLength(File file) {
long sum = 0; //文件大小
if(file!=null) {
if(file.isFile()) {
return file.length();
}
if(file.isDirectory()) {
File[] listFiles = file.listFiles();
for(int i=0;i<listFiles.length;i++) {
File file2 = listFiles[i];
sum += getFileLength(file2);
}
}
}
return sum;
}
//删除文件夹(慎用,删除彻底,不会出现在回收站)
private static boolean deleteFile(File file) {
boolean isScu = false;
if(file!=null) {
if(file.isFile()) {
file.delete();
}else {
File[] listFiles = file.listFiles();
for (File f : listFiles) {
deleteFile(f);
}
file.delete();
isScu = true;
}
}
return isScu;
}
}
这是关于递归算法的几个简单操作例子,大家可以练习一下,理解递归算法的基本思想和使用,后续在其他高级排序中会使用到递归,例如归并排序等。