1. 含义
方法调用方法自身
2. 注意
递归是一种程序设计的思想
public class Test05{
public static void main(String[] args){
//错误示范
//StackOverflowError - 栈内存溢出
//原因:调用方法就会在栈内存中开辟空间,用于存放该方法的局部变量,
// 死循环的调用方法,就会使得栈内存满载并溢出了
method();
}
public static void method(){
method();
}
}
3. 经验
a.找规律:什么情况下方法应该调用方法自身
b.找出口:什么情况下应该解决该方法
4. 案例1
需求:设计一个方法,传入一个int值n,求n的阶乘
public class Test06{
/**
分析:
5! = 1*2*3*4*5 -> 5! = 4! * 5
4! = 1*2*3*4 -> 4! = 3! * 4
3! = 1*2*3 -> 3! = 2! * 3
2! = 1*2 -> 2! = 1! * 2
1! = 1 -> 1! = 1
找规律:n! = (n-1)! * n
找出口:1! = 1
*/
public static void main(String[] args){
int num = getFactorial(5);
System.out.println(num);
}
public static int getFactorial(int n){
if(n != 1){
return getFactorial(n-1) * n;
}else{
return 1;
}
}
}
5. 案例2(不死神兔问题)
需求:有1对兔子,从出生后的第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月有几对兔子
设计一个方法,传入月份,获取当月兔子的对数
public class Test07{
/**
分析:
找规律:当月兔子的对数等于上个月+上上个月兔子的对数
找出口:1月或2月都是1对兔子
扩展:
不死神兔的数据:1,1,2,3,5,8,13,21...
这种数列叫做斐波那契数列/黄金分割数列
该数列相邻两个数的比例越往后越趋近于0.618
*/
public static void main(String[] args){
int num = getRabbit(10);
System.out.println(num);
}
public static int getRabbit(int month){
if(month == 1 || month == 2){
return 1;
}else{
return getRabbit(month-1) + getRabbit(month-2);
}
}
}