Talk is cheap, show me the code.
一、问题描述
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
/**
* 统计出兔子总数。
*
* @param monthCount 第几个月
* @return 兔子总数
*/
public static int getTotalCount(int monthCount)
{
return 0;
}
输入描述:
输入int型表示month
输出描述:
输出兔子总数int型
输入例子:
9
输出例子:
34
二、问题分析
这个题目比较有意思,这是典型的斐波那契数列问题。然而一下可能看不出是这个问题,就算不用斐波那契数列也是可以解决这个问题的,只要弄清楚了逻辑。
思路一:
假设刚出生的兔子数为 m, 出生后第二个月的兔子数为 n, 出生后第三个月的兔子数为 t;
初始的时候 m = 1, n = 0, t = 0;
第 i 个月的时候:
t(i) = t(i-1) + n(i-1);
n(i) = m(i-1);
m(i) = t(i);
思路二:
第三个月(包含刚出生的和出生一个月,出生两个月的兔子)的兔子总数 = 第二个月的兔子总数 + 第二个月的兔子到第三个月时新生下的兔子数;
第二个月的兔子到第三个月时新生下的兔子数 = 第二个月处在出生后一个月 + 第二个月出生后至少2个月的兔子;
(这是因为第二个月出生后一个月的兔子到了第三个月就能生兔子了,第二个月出生后至少2个月的在第三个月会继续生兔子)
第二个月处在出生后一个月的兔子 = 第一个月刚出生的兔子;
第二个月出生后至少2个月的兔子 = 第一个月处在出生后一个月的兔子 + 第一个月出生后失少2个月的兔子;
而,第一个月刚出生的兔子 + 第一个月处在出生后一个月的兔子 + 第一个月出生后至少2个月的兔子 = 第一个月全部的兔子数;
那么,可以得到 第二个月的兔子到第三个月时新生下的兔子数 = 第一个月全部的兔子数;
进而可以得到, 第三个月的兔子总数 = 第二个月的兔子总数 + 第一个月全部的兔子数。
这就是斐波那契数列。初始时,第一个月兔子总数为 1,第二个月兔子总数为 1。
求解斐波那契数列可以用递归法,或者直接用循环的方法解决。
解题方式1:
采用思路一直接求解。
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int s = 1, t = 0, m = 0;
for (int i = 2; i <= n; i++)
{
m = m + t;
t = s;
s = m;
}
cout << s + t + m << endl;
}
return 0;
}
解题方式2:
采用递归法求解斐波那契数列。
#include <iostream>
using namespace std;
int count(int n)
{
if (n == 1 || n == 2)
return 1;
return count(n - 1) + count(n - 2);
}
int main()
{
int n;
while (cin >> n)
{
cout << count(n) << endl;
}
return 0;
}
解题方式3:
采用循环的方式求解斐波那契数列,也可以说是动态规划的方法。
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int m = 1, t = 1;
for (int i = 3; i <= n; i++)
{
int temp = m;
m = t;
t = temp + t;
}
cout << t << endl;
}
return 0;
}
本文介绍了经典的兔子繁殖问题,它实际上是一个斐波那契数列问题。通过分析问题,提出了三种解题思路:直接求解、递归法和循环动态规划法,并详细阐述了每种方法的逻辑。最后,提供了输入输出示例以帮助理解问题解决方案。
3344

被折叠的 条评论
为什么被折叠?



