递归
递归
-
定义
在数学于计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含两个意思:递 和 归,这正是递归思想的精华所在。递归就是有去(递去)有回(归来)。
-
递归的分类
- 直接递归:称为方法自身调用自己的情况。
- 间接递归:归结为方法A调用了方法B,方法B调用方法C,C方法反过来调用了方法A。
-
递归的三要素
- 明确递归的终止条件。
- 给出递归终止时处理办法。
- 提取重复的逻辑,缩小问题规模。
-
注意事项
- 递归一定要有边界条件(条件限定),保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归的次数不能太多,否则会发生栈内存溢出现象。
- 构造方法禁止递归。
-
练习
public class RecursionDemo1 { public static void main(String[] args) { System.out.println(method(10)); System.out.println(MaxDivisor(11, 12)); System.out.println(MinMultiple(11, 12)); System.out.println(method2(9));//9 *8 *7 *6 *5 *4 *3 *2 *1 = 362880 File file = new File("E:\\尚硅谷Java全套教程\\1.尚硅谷全套JAVA教程--基础阶段"); method3(file); searchTxt(file); } //-------------------------------------------------- //文件搜索 遍历所欲的.txt文件 //1.目录搜索,无法判断有多少级目录,所以使用递归遍历目录 public static void searchTxt(File dir) { File[] files = dir.listFiles(); for (File f : files) { if (f.isDirectory()) { searchTxt(f); } else { String name = f.getName(); //windows文件时忽略大小写的 name = name.toLowerCase();//大写转换小写 if (name.endsWith(".txt")) {//如果末尾是那就输出 System.out.println(f); } } } } //-------------------------------------------------- //使用递归打印多级内存目录 public static void method3(File file) { //首先获取到直接子目录和直接子文件 File[] files = file.listFiles(); //遍历 for (File f : files) { //判断如果得到的是一个目录需要再次遍历 if (f.isDirectory()) { //表明f是一个目录,则继续遍历这个目录 //method3这个方法就是获取所有的文件, //参数传递的刚好就是目录,直接调用就可以了 method3(f); } else { //此时f不是一个目录,肯定是一个文件按 System.out.println(f); } } } //-------------------------------------------------- //递归求阶乘 public static int method2(int a) { if (a == 1) { //边界条件 System.out.print(a + " = "); return 1; } else { System.out.print(a + " *"); return a * method2(a - 1);//获取下一个被乘的数字(n-1) } } //-------------------------------------------------- //定义两个数相加 public static int method(int a) { if (a == 1) { return 1;//出口 } else { return a + (method(a - 1)); } } //-------------------------------------------------- //最大公约数数辗转相除法 //辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。 public static int MaxDivisor(int a, int b) { int max = a > b ? a : b; int min = a < b ? a : b; if (max % min != 0) { return MaxDivisor(max, max % min); } else { return min;//出口 } } public static int MinMultiple(int a, int b) { //最小公倍数就是他们的乘积除以最大公约数 return a * b / MaxDivisor(a, b); } }