Bootstrap

算法——母牛的故事(递归+迭代)

题目

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

这是一个经典的递推问题,可以通过分析每年母牛数量的变化规律,使用递归来或者迭代的方式来解决。下面我们先分析规律,再分别给出递归和迭代的C语言实现。

规律分析

设第 (n) 年的母牛数量为 (f(n))。

  • 当 (n = 1) 时,只有最初的一头母牛,所以 (f(1)=1)。
  • 当 (n = 2) 时,最初的母牛生了一头小母牛,共有 (f(2)=2) 头母牛。
  • 当 (n = 3) 时,最初的母牛又生了一头小母牛,共有 (f(3)=3) 头母牛。
  • 当 (n \geq 4) 时,第 (n) 年的母牛数量等于第 (n - 1) 年的母牛数量加上第 (n - 3) 年的母牛数量(因为第 (n - 3) 年的所有母牛在第 (n) 年都可以生小牛),即 (f(n)=f(n - 1)+f(n - 3))。

递归实现

#include <stdio.h>

// 递归函数计算第n年的母牛数量
int cows(int n) {
    if (n == 1) {
        return 1;
    } else if (n == 2) {
        return 2;
    } else if (n == 3) {
        return 3;
    } else {
        return cows(n - 1) + cows(n - 3);
    }
}

int main() {
    int n;
    printf("请输入年份n: ");
    scanf("%d", &n);
    int result = cows(n);
    printf("第 %d 年共有 %d 头母牛。\n", n, result);
    return 0;
}

代码解释

  • cows 函数是一个递归函数,根据上述分析的规律,当 (n) 为 1、2、3 时直接返回对应的母牛数量,当 (n \geq 4) 时,递归调用自身计算 (f(n - 1)) 和 (f(n - 3)) 并相加。
  • main 函数负责从用户输入获取年份 (n),调用 cows 函数计算第 (n) 年的母牛数量,并输出结果。

迭代实现

#include <stdio.h>

// 迭代函数计算第n年的母牛数量
int cows(int n) {
    if (n == 1) {
        return 1;
    } else if (n == 2) {
        return 2;
    } else if (n == 3) {
        return 3;
    }
    int f1 = 1, f2 = 2, f3 = 3, fn;
    for (int i = 4; i <= n; i++) {
        fn = f3 + f1;
        f1 = f2;
        f2 = f3;
        f3 = fn;
    }
    return fn;
}

int main() {
    int n;
    printf("请输入年份n: ");
    scanf("%d", &n);
    int result = cows(n);
    printf("第 %d 年共有 %d 头母牛。\n", n, result);
    return 0;
}

代码解释

  • cows 函数使用迭代的方式计算第 (n) 年的母牛数量。首先处理 (n) 为 1、2、3 的情况,然后使用三个变量 f1f2f3 分别保存 (f(n - 3))、(f(n - 2))、(f(n - 1)) 的值,通过循环不断更新这些变量,最终得到 (f(n)) 的值。
  • main 函数与递归实现中的 main 函数功能相同,负责获取用户输入并输出结果。

递归实现的代码简洁,但在计算较大的 (n) 时会存在大量的重复计算,效率较低;迭代实现避免了重复计算,效率更高。

;