[蓝蓝计算机考研算法训练二期]-day07

169 阅读1分钟

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;
}

image.png

方法二

思路

本方法使用递归的思想,有助于锻炼编程思维,但在程序中一般不建议写。

具体实现

#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;
}

image.png

小结

对于类似的数学问题,我们可以先试着能不能用数学方法来迭代计算输出结果,递归虽然简单,但是递归次数过多可能导致栈溢出,且递归的效率也不高。