递归思想:
递归就是自己在自己的方法里面调用自己。
使用递归时,必须有明确的结束条件,不然容易造成死循环。
递归方法使代码显得更简洁,但是效率特别低,所以一般不推荐使用。
在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出。
使用递归还要考虑例如int类型值的范围问题。
递归实现起来最关键的是处理好基础情形。
举个栗子:
爬楼梯递归:
例如:有n层楼梯,每步可以走一层或者走两层,那么走n层一共有多少种方式。
@Test
public void test2(){
System.out.println(climbStair(5));
}
/**
* 爬楼梯递归算法
* @param n
* @return
*/
public static int climbStair(int n) {
if (n == 0) {
return 0;
}else if (n==1){
return 1;
}else if (n == 2) {
return 2;
}else{
return climbStair(n - 1) + climbStair(n - 2);
}
}
分析一下这个算法:
A:如果有0个台阶,那么有0种走法,这个不用多说;
B:如果有1个台阶,那么有1种走法;
C:如果有2个台阶,那么有2种走法(一次走1个,走两次;一次走两个);
以上的B和C就是基础情形。
D:接下来就是递归了,如果台阶数目多于2个,那么首先第一步就有两种选择:第一次走1个,或者第一次走两个。这样除了第一次后边的走法就有了两种情形:climbStairs(n-1)和climbStairs(n-2)。这样一直递归下去,直到出现到了基础情形(即n=1或n=2的情形),递归到这个地方(基础情形),然后开始回溯 ,这就是所说的和递归密切相关的“回溯”了。回溯,顾名思义就是从结果倒着回去,找到整个过程,进而分析这个路径或者说是实现的过程。
原文鏈接
https://blog.csdn.net/ares_xxm/article/details/68957829
https://www.cnblogs.com/ipetergo/p/6544336.html