题目
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第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 的情况,然后使用三个变量f1
、f2
、f3
分别保存 (f(n - 3))、(f(n - 2))、(f(n - 1)) 的值,通过循环不断更新这些变量,最终得到 (f(n)) 的值。main
函数与递归实现中的main
函数功能相同,负责获取用户输入并输出结果。
递归实现的代码简洁,但在计算较大的 (n) 时会存在大量的重复计算,效率较低;迭代实现避免了重复计算,效率更高。