1 题目
古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
2 分析
将该例建立数学模型,规律为1,1,2,3,5,8, 13, 21, 34, 55, 89, 144, …,即下个月是上两个月之和,该模型在数学上称为fibonacci
数列,通过这个规律可以构造递归函数,也可以构造非递归函数计算,显然递归函数的效率非常非常低,但是程序简洁明了(不过非递归的也不复杂…),递归公式如下:
3 实现
3.1 实现1(递归)
#include<stdio.h>
int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
int main() {
for (int i = 1; i <= 40; i++) {
printf("第%d个月个数为%d\n", i, fibonacci(i));
}
return 0;
}
3.2 实现2(非递归)
#include<stdio.h>
int main() {
int f1 = 1;
int f2 = 1;
int month = 1; // 用于显示月份
for (int i = 1; i <= 20; i++, month += 2) {
printf("第%d个月的个数为%d\n", month, f1);
printf("第%d个月的个数为%d\n", month + 1, f2);
f1 = f1 + f2;
f2 = f1 + f2;
}
return 0;
}
4 运行结果
第1个月的个数为1
第2个月的个数为1
第3个月的个数为2
第4个月的个数为3
第5个月的个数为5
第6个月的个数为8
第7个月的个数为13
第8个月的个数为21
第9个月的个数为34
第10个月的个数为55
第11个月的个数为89
第12个月的个数为144
第13个月的个数为233
第14个月的个数为377
第15个月的个数为610
第16个月的个数为987
第17个月的个数为1597
第18个月的个数为2584
第19个月的个数为4181
第20个月的个数为6765
第21个月的个数为10946
第22个月的个数为17711
第23个月的个数为28657
第24个月的个数为46368
第25个月的个数为75025
第26个月的个数为121393
第27个月的个数为196418
第28个月的个数为317811
第29个月的个数为514229
第30个月的个数为832040
第31个月的个数为1346269
第32个月的个数为2178309
第33个月的个数为3524578
第34个月的个数为5702887
第35个月的个数为9227465
第36个月的个数为14930352
第37个月的个数为24157817
第38个月的个数为39088169
第39个月的个数为63245986
第40个月的个数为102334155