10、统计每个月兔子的总数。
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31
输入描述:
输入一个int型整数表示第n个月
输出描述:
输出对应的兔子总数
方法一
思路
该方法使用了斐波那契数列的思想来循环计算兔子的数量。
具体实现
#include <stdio.h>
int main() {
int n, i;
int f1 = 1, f2 = 1, f3;
printf("请输入月份n:");
scanf("%d", &n);
if (n <= 2) {
printf("第%d个月的兔子总数为:%d\n", n, f1);
} else {
for (i = 3; i <= n; i++) {
f3 = f2 + f1;
f1 = f2;
f2 = f3;
}
printf("第%d个月的兔子总数为:%d\n", n, f3);
}
return 0;
}
方法二
思路
本方法使用递归的思想,有助于锻炼编程思维,但在程序中一般不建议写。
具体实现
#include <stdio.h>
int f(int n) {
if (n <= 2) {
return 1;
} else {
return f(n-1) + f(n-2);
}
}
int main() {
int n;
printf("请输入月份n:");
scanf("%d", &n);
printf("第%d个月的兔子总数为:%d\n", n, f(n));
return 0;
}
小结
对于类似的数学问题,我们可以先试着能不能用数学方法来迭代计算输出结果,递归虽然简单,但是递归次数过多可能导致栈溢出,且递归的效率也不高。