首先,我们先了解一下什么是斐波那契数列,斐波纳契数列以如下递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2),然后我们来考虑以下问题:
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
首先,告诉大家规律,从第三个月开始,每个月的兔子数等于前两个月兔子数之和.下面是证明:
分析一下问题,前两个月,兔子的数量是不会变化的,从第三个月份开始,兔子的数量才会变化.通过以下表格详细解释,注:幼兔指的是刚出生,刚满一个月的兔子,成兔是指满一个月的兔子.
月份 | 幼兔对数 | 成兔对数 | 总体对数 |
---|---|---|---|
1 | 1 | 0 | 1 |
2 | 0 | 1 | 1 |
3 | 1 | 1 | 2 |
4 | 1 | 2 | 3 |
5 | 2 | 3 | 5 |
6 | 3 | 5 | 8 |
7 | 5 | 8 | 13 |
8 | 8 | 13 | 21 |
由表格可以看出:
幼兔对数=前月总体对数,成兔对数=前月成兔对数+前月幼兔对数=上月总体对数,总体对数=本月成兔对数+本月幼仔对数.即:
月份 | 兔子数量(单位是对) |
第一个月 | 1对 |
第二个月 | 1对 |
第三个月 | (1+1)对 |
第四个月 | (2+1)对 |
第五个月 | (3+2)对 |
拿一组数据来解释,比如第五个月.第五个月兔子的数量等于第四个月份的数量加上第三个月份的数量.为什么要这么来计算,原因如下:
加上第四个月份的数量是之前就存在的,相当于基数;加上第三个月份的数量,指的是产生的新的兔子的数量
代码实现:
递归方法实现:
import java.util.Scanner;
public class Fibonacci {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入月份");
int month = in.nextInt();
System.out.println("第"+month+"个月的兔子对数:"+method1(month));
}
private static int method1(int n) {
if(n <= 0){
return 0;
}
if(n == 1){
return 1;
}else if(n == 2){
return 1;
}else return method1(n-1)+ method1(n-2);
}
通过循环实现:
public static void method2() {
int s1 = 1;
int s2 = 1;
int temp;
Scanner in = new Scanner(System.in);
System.out.println("请输入月份");
int month = in.nextInt();
if (month < 0) {
System.out.println("输入的月份有误");
} else {
for (int i = 1; i <= month; i++) {
if (i == 1) {
System.out.println("第" + i + "个月的兔子对数:" + s1);
continue;
} else if (i == 2) {
System.out.println("第" + i + "个月的兔子对数:" + s2);
continue;
} else {
temp = s2;
s2 = s1 + s2;
s1 = temp;
System.out.println("第" + i + "个月的兔子对数:" + s2);
}
}
}
}