不死神兔-斐波那契数列
【需求】
一开始是1对兔子,它们3个月后生1对兔子,它们生的兔子在出生3个月后也开始生兔子,问,没有兔子死掉,到第20个月,有多少对兔子?
这个也叫斐波那契数列
【思路】
- 为了存储多个月的兔子对数,定义一个数组,用动态初始化完成数组元素的初始化,长度为20
- 因为第1个月、第2个月兔子的对数已知为1,因此数组的1元素、2元素为1
- 用循环实现计算每个月的兔子的对数
- 输出数组中最后一个元素的值,也就是第20个月兔子的对数
package e276;
public class RabbitDemo {
public static void main(String[] args) {
int[] rabbitA = new int[20];
rabbitA[0]=1;
rabbitA[1]=1;
rabbitA[2]=rabbitA[0]+rabbitA[1];
rabbitA[3]=rabbitA[1]+rabbitA[2];
rabbitA[4]=rabbitA[2]+rabbitA[3];
for (int x=2;x<rabbitA.length;x++){
rabbitA[x]=rabbitA[x-2]+rabbitA[x-1];
}
System.out.println("遍历数组");
for (int x:rabbitA){
System.out.print(x+",");
}
}
}
/*
遍历数组
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,
*/
递归
【递归概述】
方法定义中调用方法本身,(需要先回顾e92的不死神兔案例)
【递归解决问题的思路】
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
——以不死神兔为例,用e92的办法,必须限定数组长度,所要的月份在这个范围之内
【递归解决问题要找到2个内容】
- 递归出口,否则会出现内存溢出
- 递归规则,与原问题相似的规模较小的问题
--------------------------------------------------------------
package e276;
public class RecursionDemo {
public static void main(String[] args) {
// 不死神兔案例,斐波那契数列
int[] rabbitA = new int[20];
rabbitA[0]=1;
rabbitA[1]=1;
for (int i=2;i<rabbitA.length;i++){
rabbitA[i]=rabbitA[i-1]+rabbitA[i-2];
}
System.out.println("\t第20个月有多少兔子");
System.out.println(rabbitA[19]);
System.out.println("\t用递归求第20个月兔子数");
System.out.println(f(20));
}
// 使用递归的方式实现不死神兔
public static int f(int n){
if (n==1||n==2){
return 1;
}else{
return f(n-1)+f(n-2);
}
}
// 用if循环添加停止的点
//不加if又怎样:
// public static int f(int n){
// return f(n-1)+f(n-2);
// }
// StackOverflowError当堆栈溢出时抛出一个应用程序递归太深error
// 因为没有设置停止的点
}
// 第20个月有多少兔子
//6765
// 用递归求第20个月兔子数
//6765