1.算法设计要求
假设第1个月有1对初生的兔子,第2个月进入成熟期,第3个月开始生育兔子,而1对成熟的兔子每月会生1对兔子,兔子永不死去.....那么,由1对初生的兔子开始,12个月后会有多少对兔子呢?
2.问题分析
不妨拿新出生的1对小兔子分析。
第1个月,小兔子①没有繁殖能力,所以还是1对。
第2个月,小兔子①进入成熟期,仍然是1对。
第3个月,兔子①生了1对小兔子②,于是这个月共有2 (1+1=2)对兔子。
第4个月,兔子①又生了1对小兔子③,因此共有3 (1+2=3)对兔子。
第5个月,兔子①又生了1对小兔子④,而在第3个月出生的兔子②也生下了1对小兔子⑤,因此共有5(2+3=5)对兔子。
第6个月,兔子①②③各生下了1对小兔子新生的3对兔子加上原有的5对兔子,这个月有8 (3+5=8)对兔子。
为了让表达更清楚,可用图示分别表示新生兔子、成熟期兔子和生育期兔子,兔子的繁殖过程如图所示。
这个数列有如下十分明显的特点:从第3个月开始,当月的兔子数=上月兔子数+当月新生兔子数,而当月新生兔子数正好等于上上月的兔子数。因此,前面相邻两项之和便构成后一项,换言之:
当月的兔子数=上月兔子数+上上月的兔子数
斐波那契数列如下:
1, 1, 2, 3, 5, 8, 13, 21, 34,...
递归表达式如下:
3.算法设计
#include<stdio.h>
int main() {
int n=12;
//前两次的值都为1
int s1 = 1;
int s2 = 1;
//前两个月
printf("%d \n", s1);
printf("%d \n", s2);
//m每次迭代记录单前的值,和上次的值。
for (int i = 3; i <= n; i++) {
s2 = s2 + s1; //当前的值
s1 = s2 - s1; //上次的值
printf("%d \n", s2);
}
return 0;
}