递归
递归的概述 :递归指的是在方法内自身调用自身的现象
递归使用的前提
1.使用递归时,一定要使用条件判断来判断是否跳出递归 否则会出现溢出栈的错误
2.在递归中虽然有条件限制 但是也不能进行多次递归,不然也会出现溢出栈的错误
3.构造方法是不能递归的
4.每次递归传入的值都需要发生改变,不然会发生栈溢出
递归的优缺点
优点:实现简单,可读性好
缺点:递归调用,占用空间大(每一次函数的调用都要开辟相应的空间)
递归的原理
每次调用自身都会有自己的参数(以某种方式扩大或者缩小)并且每一次调用都会有一次判断是返回值还是继续进行递归(一般都在递归的开头),当程序执行完最后一层递归调用后,参数变量满足了递归出口的条件就开始逐级返回。
递归的分类
递归有两种递归的方式分别为 间接递归 和 直接递归
直接递归 :即自身调用自身,如代码所示调用递归这个方法 传入一个int类型的参数 进入递归循环会先判断这个值是否大于等于10 如果大于十则会返回该参数 如果小于十 就会进行递归 参数会在自身调用自身方法时进行自加一直到自身大于等于十才会退出递归
//有返回值类型
public int recursive(int a){
//如果a大于等于10则会结束递归
if(a>=10){ //方法出口
return a;
}
return recursive(++a); // 递归
}
//无返回值类型
public void recursive(int a){
//如果a大于等于10则会结束递归
if(a>=10){ //方法出口
return a;
}
recursive(++a); // 递归
}
间接递归 :A调用B B调用C C调用A
//A方法
public int A(int a){
//程序出口
if(a>10){
return a;
}
//调用B
return B(++a);
}
B方法
public int B(int a){
//调用C
return C(++a);
}
C方法
public int C(int a){
//调用A
return A(++a);
}
//此时我们通过给间接递归传入一个参数 1 A方法返回了一个 11
练习
使用递归求斐波那契数列第N位数字
int fib(int n){
if (n<2) {
return n;
} else {
return fib(n-1) + fib(n-2);
}
}