递归
递归方法是调用自身的方法
看一个阶乘的demo
public class Main {
/**
* 5*4*3*2*1
* @param n
* @return
*/
public static int Method(int n){
if (n==1){
return 1;
}else{
return n * Method(n-1);
}
}
public static void main(String[] args){
System.out.print(Method(5)); //120
}
}
n= 5的时候 走else 里面 返回的是5*Method(4) 然后接着走Method()方法 5*4*Method(3) 接着走5*4*3*Method(2)
然后走到1 的时候 停止了,return 1 else方法不在走了,那就是 5*4*3*2*1 这个过程就是想要的结果,
所以呢,我们使用递归的时候需要注意
1 递归停止的判断
2 递归的进行体(就是他的算法)
为了加深理解在举一个案例
斐波那契数列
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 .......
这样的一系列数字,后面一项是其前面2项之后
例如当前5 设置为n 其前面一项为n-1 其前面2项为n-2
计算某一项的公式为(n-1) +(n-2)
public class Main {
/**
* 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 .......
* @param n
* @return
*/
public static int Method(int n){
if (n==1 || n==2){
return 1;
}else{
return Method(n-1) + Method(n-2);
}
}
public static void main(String[] args){
System.out.print(Method(5));
}
}
2个案例 可以看出
递归 一定要有一个终止其结束的条件,以及一个运算的方法体..
递归的有点:
代码更简洁清晰,可读性更好
递归的缺点:
递归调用函数,浪费空间;
递归太深容易造成堆栈的溢出