递归:
先递推,再回归:方法定义中调用方法本身的现象。 -------------------------- 数学归纳法的思想
注意事项:
1.要有出口,否则就是死递归
2.次数不能太多,否则就内存溢出
3.构造方法不能递归使用
案例分析:
案例一:兔子问题(斐波那契数列) ----------------------------------- 前后两数的商无限接近于黄金分割比例:0.618
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第十个月的兔子对数为多少?
分析:F(1)=1;F(2)=1;F(n)=F(n-1)+F(n-2)...
public class Demo01 {
public static void main(String[] args) {
System.out.println(birth(10));
System.out.println(birth2(10));
}
//递归写法 ---- 数学归纳法
public static int birth(int n) {
if(n<3) { //设置递归出口
return 1;
}else {
return birth(n-1)+birth(n-2);
}
}
//非递归写法
public static int birth2(int n) {
int m1 = 1;
int m2 = 1;
int temp;
if(n==1 || n==2) {
return 1;
}
for(int i=3;i<=10;i++) {
temp = m1;
m1 = m2;
m2 = m1+temp;
}
return m2;
}
}
案例二:猴子吃桃问题
小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?
分析:10 -- 1 9 -- (1+1)*2 8 -- ((1+1)*2+1)*2 ......
public class Demo02 {
public static void main(String[] args) {
System.out.println(sub(2)); //4
System.out.println(sub(3)); //10
System.out.println(sub(10)); //1534
System.out.println(sub2(2)); //4
System.out.println(sub2(3)); //10
System.out.println(sub2(10)); //1534
}
//递归写法
public static int sub(int m) { //m为天数
if(m==1) { //设置递归出口
return 1;
}else {
return (sub(m-1)+1)*2;
}
}
//非递归写法
public static int sub2(int m) {
int temp;
int n = 1;
if(m==1) {
return 1;
}
for(int i=2;i<=m;i++) {
temp = (n+1)*2;
n = temp;
}
return n;
}
}