递归的简单理解:A方法自己调用A方法,也就是说自己调用自己,就是递归。
递归的核心思想:
具体来说就是把复杂的问题,通过层层转化,转为一个与原问题相似的规模较小的问题来解决。
在Java的方法实现上,这种相似的大问题转小问题的解决方式,就产生了自己调用自己的现象。总不能一直把大问题无限分解,总有一个小问题会结束分解,所以递归必须要有明显的结束条件,否则就是无限递归了。
1. 递归的结构必须包括两个部分:
- 递归头:什么时候不调用自身方法。如果没有递归头,将陷入死循环。也就是说递归头就是终止调用的边界条件。
- 递归体:调用自身方法用于解决规模较小的与原问题相似的小问题,进一步缩小问题的规模 。
2. 递归示例(自己调用自己):
求阶乘的例子,公式为:factorial(n) = n*factorial(n-1)。当n=0或1时,结果为1,n为负数时,不能求阶乘,代码中要有体现。
package com.zctou.method;
public class Demo06 {
public static void main(String[] args) {
// 递归示例
// 求一个整九的阶乘 5! = 5x4x3x2x1 每次减1
// 负数不能有阶乘,0和1的阶乘是1
int i = factorial(0) ;
System.out.println(i);
}
//递归思想,i==1是出口
public static int factorial(int i) {
if(i<0) {
System.out.println("求阶乘不能是负数,请检查~!");
return -1 ;
}
if(i==1 || i==0) {
return 1 ;
} else {
return i*factorial(i-1);
}
}
}
3. 递归的基本形式:
从上面求阶乘的例子可以看出,递归的语法结构大致如下:
method(mod) {
if(endCondition) { //递归头
end;
} else {
method(mod_small) //递归体
}
}
4.递归的过程
从上图看,递归,实际上就是一个去与回的过程。Java中,递归的方式是通过堵堆栈来实现的,整个过程实际上就是一个栈的入栈和出栈问题。所以当我们堆栈过多时,很容易就会产生内存溢出问题。