题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列1,1,2,3,5,8,13,21.... 第10个月正好是55对....
一、分析题目
兔子繁殖的规律为1,1,2,3,5,8,13,21....可以看出从第三个月起,之后的每个月的数量刚好是前两个月兔子的总和,即1+1=2、1+2=3、2+3=5、3+5=8······,我们可以将此转化为数学问题,即兔子总数的函数为F(n)=F(n-1)+F(n-2),F(1)=1,F(2)=1。解决此问题的方法可以用递归思想,也可用数组的方式。
二、数组
import java.util.Scanner;//引入Scanner包,用于输入
public class Test01 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入月份:");
int i=sc.nextInt();
int[] arr=new int[i];
for (int j = 0; j < i; j++) {
//第一个月兔子为一对
if(j==0){
arr[j]=1;
//第二个月兔子为一对
}else if(j==1){
arr[j]=1;
}else{//第j+1月兔子
arr[j]=arr[j-1]+arr[j-2];
}
}
System.out.println(arr[i-1]);
}
}
运算结果:
在第十个月的时候已经繁殖了55对兔子,在int数据类型下最多可输到第55个月,为2144908973对兔子,再输入就会超出int的范围,想要更多的可以把int换为long、float、double数据类型。
三、递归函数
import java.util.Scanner;
public class Fib {
public static long getFib(long n){
if (n == 1||n==2) {
return 1;
}
return getFib(n-2)+getFib(n-1);
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入月份:");//输入月份
long h=getFib(sc.nextLong());//调用getFib函数
System.out.println(h);
}
}
运行结果:
当n为3的时计算getFib(2) + getFib(1),当n为4的要计算getFib(3) + getFib(2) ,这时getFib(3)就是重复计算了。运行 fibonacci(50) 会出现服务器假死现象,毕竟递归需要堆栈,数字过大内存不够。