Java 递归 作者:马育民 • 2020-01-28 17:25 • 阅读:10067 # 介绍 **递归**:指在当前方法内调用自己的这种现象。 ### 递归的分类 递归分为两种: - 直接递归:称为方法自身调用自己。 - 间接递归:方法之间调用,如:A方法调用B方法,B方法调用C方法,C方法调用A方法。 ### 简单例子 ``` void test(){ System.out.println(1); // 方法递归,自己调用自己 test(); } ``` **注意:** 递归有次数限制的,不能太多,否则会报错 ### 例子:递归次数 ``` int i = 1; void test2(){ i++; System.out.println(i); // 方法递归,自己调用自己,是有次数限制的,不能太多,否则会报错 test2(); } ``` **结论:**递归1万多次就会报错 ### 注意事项 - 递归一定要有 **条件限制**,保证递归能够 **停止下来**,否则会发生栈内存溢出。 - 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。 - 构造方法,禁止递归 ```java public class Demo01DiGui { public static void main(String[] args) { // a(); b(1); } /* * 3.构造方法,禁止递归 * 编译报错:构造方法是创建对象使用的,不能让对象一直创建下去 */ public Demo01DiGui() { //Demo01DiGui(); } /* * 2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。 * 4993 * Exception in thread "main" java.lang.StackOverflowError */ private static void b(int i) { System.out.println(i); //添加一个递归结束的条件,i==5000的时候结束 if(i==5000){ return;//结束方法 } b(++i); } /* * 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main" * java.lang.StackOverflowError */ private static void a() { System.out.println("a方法"); a(); } } ``` # 递归累加求和 ### 计算1 ~ n的和 **分析**:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。 **实现代码**: ```java public static void main(String[] args) { // 创建对象,没给对象起名,匿名对象 //计算1~num的和,使用递归完成 // 调用求和的方法 int sum = new Std50_递归().add(5); // 输出结果 System.out.println("sum = "+ sum); } int add( int i){ /* num为1时,方法返回1, 相当于是方法的出口,num总有是1的情况 */ if( i == 1){ return 1; } /* num不为1时,方法返回 num +(num-1)的累和 递归调用getSum方法 */ return i + add(i-1); } ``` **图解:** [](/upload/0/0/1IX5y4WARNG7.png) 递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。 # 递归求阶乘 **阶乘**:所有小于及等于该数的正整数的积。 ```java n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1 ``` **分析**:这与累和类似,只不过换成了乘法运算,学员可以自己练习,需要注意阶乘值符合int类型的范围。 ``` 推理得出:n! = n * (n-1)! ``` **代码实现**: ```java public class DiGuiDemo { //计算n的阶乘,使用递归完成 public static void main(String[] args) { int n = 3; // 调用求阶乘的方法 int value = getValue(n); // 输出结果 System.out.println("阶乘为:"+ value); } /* 通过递归算法实现. 参数列表:int 返回值类型: int */ public static int getValue(int n) { // 1的阶乘为1 if (n == 1) { return 1; } /* n不为1时,方法返回 n! = n*(n-1)! 递归调用getValue方法 */ return n * getValue(n - 1); } } ``` # 求阶乘的和 ``` 5!+4!+3!+2!+1! ``` ### 代码实现 ``` static int d(int i) { if(i==1) { return 1; }else { return i * d(i-1); } } static int e(int i) { if(i==1) { return 1; }else { return d(i)+e( i-1 );//d(5)+d(4)+d(3)+d(2)+d(1) } } public static void main(String[] args) { // int res=s.d(5);//5*4*3*2*1 int res=e(5);//153 System.out.println(res); } ``` 原文出处:http://malaoshi.top/show_1EF4seypLbVu.html