有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
输入:
9
输出:
34
分析
| 1月大 | 2月大 | 3月大 | |
| 一月 | 1 | 0 | 0 |
| 二月 | 0 | 1 | 0 |
| 三月 | 1 | 0 | 1 |
| 四月 | 1 | 1 | 1 |
| 五月 | 2 | 1 | 2 |
| 六月 | 3 | 2 | 3 |
| 七月 | 5 | 3 | 5 |
| 八月 | 8 | 5 | 8 |
| 九月 | 13 | 8 | 13 |
| 十月 | 21 | 13 | 21 |
| 十一月 | 34 | 21 | 34 |
| 十二月 | 55 | 34 | 55 |
规律: 简单递推
f(月份,1月大) = f(月份,3月大) = f(月份-1,2月大) + f(月份-1,3月大)
f(月份,2月大) = f(月份-1, 1月大)
<?
//递推使用
function getNum( $month )
{
$oneCount = 1;
$twoCount = 0;
$threeCount = 0;
$start = 1;
while ($start < $month)
{
$tmp = $oneCount;
$oneCount = $twoCount + $threeCount;
$twoCount = $tmp;
$threeCount = $oneCount;
$start++;
}
return $oneCount+$twoCount+$threeCount;
}
function main()
{
while ($month = fgets(STDIN))
{
$num = getNum(intval($month));
print $num."\n";
}
}
main();
优化:如果以每个月兔子数量为基础,可以发现兔子总数符合斐波拉契数列的规律
原文:https://www.cnblogs.com/cing123/p/9892516.html