两种思考方式解决Java算法之经典兔子问题(斐波那契数列)

题外话:今天小测验的题目考到了兔子问题 觉得对算法还是不能忽视 特此记录一下

问题:
一对兔子 从出生后第3个月起每个月都生一对兔子
小兔子长到第三个月后每个月又生一对兔子
假如兔子都不死 问每个月的兔子总数为多少 ?

解决:

1、思考方式一:分析法

已知 兔龄2个月及2个月以上的兔子 在新的1个月 每只都会生1对兔子
那么对于新的这个月来说 之前兔龄2个月及2个月以上的兔子就是2个月前的兔子总数
因为之前兔龄2个月及2个月以上的兔子到这个月已经可以生崽了 其中的每对都会生一对小兔子
也就是说 新的月相比上个月增加的兔子数是1个月前的兔子数(基数) + 2个月前的兔子(崽子 相当于是复制品 每对兔子复制一份崽子)
当月的兔子数等于前两个月的兔子数之和

2、思考方式二:找规律法

个月时 一对兔子成了两对兔子 其中一对是它自己 另一对是生下的崽子
个月时 两对兔子变成了三对 其中一对是最初的一对 另一对是上个月生的兔子 第三对是刚生下来的崽子
个月时 三对兔子变成了五对···
个月时 五对兔子变成了八对···
这组数从第三个数开始 每个数是前两个数的和
我们可以分析得到 每个月的兔子数量为1,1,2,3,5,8,13,21…
这是一种典型的斐波那契数列
在这里插入图片描述


好了 下面该上代码了:
实现方式也有两种 一种是循环法 另一种是递归法

循环法:

public static void main(String[] args) {
 	int total = 1;// 兔子总数 初始值为1对
    int pre1count = 1;// 1个月前的兔子总数
    int pre2count = 1;// 2个月前的兔子总数
    for (int month = 1;month<=36;month++)
    {
        if (month < 3)
        {
            total = 1;
        }
        else
        {
            total = pre1count + pre2count;
            pre2count = pre1count;
            pre1count = total;
        }
        System.out.println("第"+month+"月共有"+total+"对兔子");
    }
}

递归法:

public static void main(String[] args) {
   for (int month=1;month<=36;month++)
    {
        System.out.println("第"+month+"月共有"+birth(month)+"对兔子");
    }
}

private static int birth(int month)
{
    return month<3 ? 1:birth(month-1)+birth(month-2);
}

发布了56 篇原创文章 · 获赞 0 · 访问量 1155

猜你喜欢

转载自blog.csdn.net/Piconjo/article/details/104699133