递归
概述
递归的分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| public class Demo01DiGui { public static void main(String[] args) { b(1); }
public Demo01DiGui() { }
private static void b(int i) { System.out.println(i); if(i==5000){ return; } b(++i); }
private static void a() { System.out.println("a方法"); a(); } }
|
递归的简单使用
累加求和
计算1 ~ n的和
分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class DiGuiDemo { public static void main(String[] args) { int num = 5; int sum = getSum(num); System.out.println(sum); }
public static int getSum(int num) {
if(num == 1){ return 1; }
return num + getSum(num-1); } }
|
递归求阶乘
阶乘
阶乘:所有小于及等于该数的正整数的积。
n的阶乘:n! = n * (n-1) … 3 * 2 * 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class DiGuiDemo { public static void main(String[] args) { int n = 3; int value = getValue(n); System.out.println("阶乘为:"+ value); }
public static int getValue(int n) { if (n == 1) { return 1; }
return n * getValue(n - 1); } }
|
递归打印多级目录
结合File类,打印多级目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class DiGuiDemo2 { public static void main(String[] args) { File dir = new File("D:\\aaa"); printDir(dir); }
public static void printDir(File dir) { File[] files = dir.listFiles();
for (File file : files) { if (file.isFile()) { System.out.println("文件名:"+ file.getAbsolutePath()); } else { System.out.println("目录:"+file.getAbsolutePath()); printDir(file); } } } }
|
结合File类判断方法,打印指定后缀文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package testRecursive03;
import java.io.File;
public class TestRecursive { public static void main(String[] args) { File dir = new File("E:\\chrome下载"); TestDirectory(dir); } public static void TestDirectory(File dir){ File[] files = dir.listFiles(new FileFilterImp());
for (File file : files) { if (file.isFile()){
System.out.println(file); }else { System.out.println(file); TestDirectory(file); } }
} }
|