今天给大家带来一个经典题,斐波那契数列,题目如下:
//题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,
//小兔子长到第三个月后每个月又生一对兔子。假如兔子都不死,要求根据输入的月份输出对应兔子的个数
//解题思路: 月 份 :1 2 3 4 5 6 7 8 9
// 兔子数 :1 1 2 3 5 8 13 21 34
// 上方可以看出,是有规律可循的,第n个数 == n-1 + n-2;
//共2种实现方式,首先展示第一种,利用数组实现
Scanner sca = new Scanner(System.in);
System.out.println("请输入您要查看的月数:");
int month = sca.nextInt();
int[] num = new int[month];
//前两位是固定值,设置固定值
num[0] = 1;
num[1] = 1;
for (int i = 2; i < num.length; i++) {
num[i] = num[i-1] + num[i-2];
}
System.out.println(month + "月兔子共有:" + num[month-1] + "对");
//第二种方式,利用递归实现,递归原理:假设输入的是5,从5开始依次往下走,再返回来,最后返回结果,类似于循环,但不是循环
int num2 = fbnqRabbit(month);
System.out.println("第" + month + "个月的兔子数:" + num2 + "只");
}
/**
* 递归实现兔子生兔子(斐波那契数列)
* @param month 输入的月份
* @return 返回month对应的兔子对儿数
*/
public static int fbnqRabbit(int month) {
//如果到了1或2直接返回1
if (month == 1 || month == 2) {
return 1;
}
//返回每次计算值,在本方法内完成,最后返回month月份对应的数
return fbnqRabbit(month - 1) + fbnqRabbit(month - 2);
}
递归实现会有一个问题,输入50以上的数字就不能输出结果了,就算能够输出,也是非常非常慢,使用递归实现该问题如果输入数字过大可能会导致栈内存溢出,为了解决这个问题,利用数组实现,也是不错的选择,数组实现的原理,也是先将数据复制到数组内,然后输入1000不是问题,测试通过。
制作不易,望各位多多支持!!🤞💕