方法的递归
递归一般指方法自己调用自己
递归结构包括两个部分:
递归头: 判断递归什么时候结束,如果没有程序将陷入死循环
递归体: 用来判断什么时候调用自身方法
用递归写一个小程序判断数字的阶乘:
//阶乘:符号为!
// 1! 1的阶乘 | 2! 2的阶乘 | 3! 3的阶乘
//1! =1
//2! =1*2 2
//3! =1*2*3 6
//4! =1*2*3*4 24
//5! =1*2*3*4*5 120
public int test(int a){
if (a==1){
return 1; //当a=1时方法不再调用 停止调用自身;
}else{
return a * test(a-1); //如果a不等于1时 调用自身方法并参数为a-1
}
}
//调用方法
System.out.println(test(5))
输出结果为:120
//解析
//方法执行传入参数为 a=5
//方法执行到 a * test(a-1) 此时a=5 return未执行 优先调用test方法 此时方法在 5*test(5-1) test方法在执行
//方法进入第一次递归,此时a为4 return未执行 优先调用test方法 此时方法在 4*test(4-1) test方法在执行
//方法进入第二次递归,此时a为3 return未执行 优先调用test方法 此时方法在 3*test(3-1) test方法在执行
//方法进入第三次递归,此时a为2 return未执行 优先调用test方法 此时方法在 2*test(2-1) test方法在执行
//方法进入第四次递归,a=1 程序进入if条件 不再调用自身,递归停止, return 1
//第一次return 返回1 连接上面 return 2*(1)
//第二次return 返回2 连接上面 return 3*(2*1)
//第二次return 返回3 连接上面 return 4*(3*2*1)
//第二次return 返回4 连接上面 return 5*(4*3*2*1)
// **概括起来: 5*test(4*test(3*test(2*test(2-1)))) 可以理解为括号里的先运算**
在递归方法中方法 先执行 后返回
- 递归方法在没有递归头的情况下,会发生栈内存溢出错误:stackOverflowError ;
- 在java方法的执行中 每调用一次main方法就等于在叠罗汉 而我们虚拟机的实际容量是有限的 当堆栈高度超出时就会报错;
- 有时在有递归头的情况下 方法递归的太深 程序也会报错;
- 在实际开发中一般不建议使用递归方法 一般用for循环或者while循环来代替