题目描述
有一只兔子,从出生后第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." "; } } main();
优化:如果以每个月兔子数量为基础,可以发现兔子总数符合斐波拉契数列的规律