编程算法案例2

作者:championsky | 发布时间:

兔子产子

1.问题描述

有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总对数为多少?

2。分析与算法设计:

这也是一道经典的斐波那契数列问题。我们可以使用循环或者递归的方法来计算斐波那契数列。但由于递归算法需要反复调用函数,效率较低,所以这里推荐使用循环算法。

根据题意,我们可以得到以下重要信息:

  1. 第1个月兔子对数为1。
  2. 第2个月兔子对数为1。
  3. 第3个月兔子对数为2(因为第1对兔子生出了1对兔子)。
  4. 从第4个月开始,每对兔子每个月都会生出1对兔子。

由此可知,第n个月的兔子总对数应该等于第n-1个月和第n-2个月的兔子总对数之和,但需要注意的是,第n-1个月的兔子数量要加上在上一个月刚出生的兔子对数。

我们可以定义一个列表,存放每个月份的兔子对数。由于第1个月和第2个月的兔子对数都为1,所以我们可以提前将它们添加到列表中,然后用循环计算之后每个月的兔子对数,并逐个添加到列表中。最后,我们可以输出列表中的所有元素即可。

Python语言实现

def count_rabbits(num_months):
    """
    计算给定月份内每个月的兔子总对数
    """
    pairs = [1, 1] # 第1个月和第2个月兔子对数均为1
    
    for i in range(2, num_months):
        # 计算第i个月刚出生的兔子对数
        newborn_pairs = pairs[i-2]
        # 计算第i个月兔子对数并添加到列表中
        pairs.append(pairs[i-1] + newborn_pairs)
    
    return pairs

if __name__ == '__main__':
    pairs = count_rabbits(30)
    print(pairs)

以上代码中,我们定义了一个函数 count_rabbits(num_months),用于计算给定月份内每个月的兔子总对数。函数通过循环遍历每个月份,依次计算该月份兔子总对数并添加到列表 pairs 中,并最终返回该列表。

运行以上代码,即可得到30个月内每个月的兔子总对数:

1,  1,  2,  3,  5,  8, 

13,  21,  34, 55, 89, 144, 

233, 377, 610, 987, 1597, 2584,

4181, 6765, 10946, 17711, 28657, 46368, 

75025, 121393, 196418, 317811,514229, 832040

这样就得到了每个月的兔子总对数,我们也可以将这些数值表示成折线图或柱状图等形式进行可视化展示。此外,我们还可以加入一些数据校验功能,比如判断输入参数的类型是否正确、判断输入月份数是否超过了规定范围等。

 

C语言实现

#include <stdio.h>
#include <math.h>

int main() {
    int n = 30; // 经过 30 个月
    int f[n]; // 定义斐波那契数列

    f[0] = f[1] = 1; // 从第三个月开始每个月都产生一对兔子,因此将 f[0] 和 f[1] 都赋值为 1

    // 计算斐波那契数列
    for (int i = 2; i < n; i++) {
        f[i] = f[i-1] + f[i-2];
    }

    // 计算每个月的兔子对数,并输出结果
    for (int i = 0; i < n; i++) {
        printf("第%d个月有%d对兔子\n", i+1, f[i]);
    }

    return 0;
}

在以上代码中,我们通过循环计算出斐波那契数列中每个数的值,即为每个月的兔子对数,并用循环输出结果。

运行以上代码,您将得到以下结果:

第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对兔子

JAVA语言实现

public class Rabbit {
    public static void main(String[] args) {
        int n = 30; // 经过 30 个月
        int[] f = new int[n]; // 定义斐波那契数列

        f[0] = f[1] = 1; // 从第三个月开始每个月都产生一对兔子,因此将 f[0] 和 f[1] 都赋值为 1

        // 计算斐波那契数列
        for (int i = 2; i < n; i++) {
            f[i] = f[i-1] + f[i-2];
        }

        // 计算每个月的兔子对数,并输出结果
        for (int i = 0; i < n; i++) {
            System.out.printf("第%d个月有%d对兔子\n", i+1, f[i]);
        }
    }
}

在以上代码中,我们同样通过循环计算出斐波那契数列中每个数的值,即为每个月的兔子对数,使用 printf 方法输出结果。

运行以上代码,您将得到以下结果:

第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对兔子

总结:

本篇文章为大家介绍了一道经典的斐波那契数列问题,通过使用循环算法,实现了计算给定月份内每个月的兔子总对数的功能。代码设计简单易懂,同时也掌握了Python语言中列表的使用和循环遍历的技巧。