递归:
1、递归的效率比较低,因为方法需要不断的进栈和出栈
2、递归的算法比较浪费栈内存的空间,栈内存本身比较小,很容将栈内存的内存空间耗尽,
那么程序就无法继续执行下去,报出一个错误:
StackOverflowError:栈内存溢出
3、国外有一个网站:StackOverflow,专业版的知乎
4、递归算法的好处:
思路比较简单,假设简单问题解决了
5、所有的递归算法,都有非递归的解决方式,只不过非递归的算法设计比较困难
编程实战01:
需求:
计算5的阶乘,5! = 5 * 4 * 3 * 2 * 1
package com.ujiuye.demos;
public class Demo19_递归阶乘 {
/**
* 计算5的阶乘,5! = 5 * 4 * 3 * 2 * 1
*/
public static void main(String[] args) {
System.out.println(jiecheng(5));
}
public static int jiecheng(int n) {
if (n > 1) {
return n * jiecheng(n-1);
} else {
return 1;
}
}
}
编程实战02:
需求:
斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55...输出前15个
package com.ujiuye.demos;
public class Demo20_斐波那契数列 {
/**
* 有一个数列:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55
计算第n个斐波那契数
* @param args
*/
public static void main(String[] args) {
// for(int i = 1; i <= 45; i++) {
// System.out.print(fibo(i) + " ");
// }
// System.out.println(fibo(200));
System.out.println(fibo2(200));
}
public static long fibo2(int n) {
long[] arr = new long[n];
arr[0] = 1;
arr[1] = 1;
for(int i = 2; i < n; i++) {
arr[i] = arr[i-1] + arr[i-2];
}
return arr[n-1];
}
public static int fibo(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fibo(n - 1) + fibo(n - 2);
}
}
}
编程实战03:
需求:
键盘录入一个文件夹路径
打印这个文件夹下的所有文件的绝对路径(包含子文件夹的内容)
结合之前学过的File类完成递归,传说中的综合题!!!
package com.ujiuye.demos;
import java.io.File;
import java.util.Scanner;
public class Demo21_递归遍历文件夹 {
/**
* 键盘录入一个文件夹路径
打印这个文件夹下的所有文件的绝对路径(包含子文件夹的内容)
*/
//主方法
public static void main(String[] args) {
File dir = getDir();
printDir(dir);
}
//递归方法
public static void printDir(File dir) {
File[] subFiles = dir.listFiles();
if (subFiles != null) {
for (File file : subFiles) {
if (file.isFile()) {//如果是文件,直接使用系统方法,获取绝对路径
System.out.println(file.getAbsolutePath());
} else {//如果是文件夹,就使用自己定义的方法,打印该文件夹下的所有内容
printDir(file);
}
}
}
}
//键盘录入一个文件夹路径
public static File getDir() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("请录入一个文件夹路径");
String line = sc.nextLine();
File dir = new File(line);
if (dir.isDirectory()) {
return dir;
} else {
System.out.println("录入非法,请重来");
}
}
}
}