用c语言递归法解决捕鱼知多少问题,要求输出每一个人醒来时看到的鱼的数量
时间: 2024-10-08 22:04:58 浏览: 52
在 C 语言中,我们可以使用递归算法来解决“捕鱼知多少”问题,这是一个经典的动态规划问题。这个问题通常描述为一个人在一排渔网上睡觉,每次醒来时可以吃掉他右侧的第一个鱼(如果有的话),然后继续睡觉。当最后一张网有鱼时,他只能吃掉这一条。目标是找到每一步醒来时能看到的鱼的最大数量。
这里是一个简单的递归函数示例:
```c
#include <stdio.h>
// 递归函数,传入当前位置i和剩余未吃掉的鱼数组fish
int fishCount(int i, int fish[], int n) {
// 如果已经到达最后一条鱼或者鱼已经被吃完
if (i >= n || !fish[i])
return 0;
// 当前人吃了右边的第一条鱼,然后继续睡
int withFish = fish[i] + fishCount(i + 1, fish, n);
// 如果没吃鱼,直接跳到下一张网
int withoutFish = fishCount(i + 1, fish, n);
// 返回两者中的较大值,即最大鱼数
return max(withFish, withoutFish);
}
// 辅助函数计算最大值,假设整型溢出不会影响结果
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int fish[] = {3, 4, 2, 1}; // 示例数据,渔网上有不同数量的鱼
int n = sizeof(fish) / sizeof(fish[0]);
printf("第一个人醒来时能看到的鱼的数量是: %d\n", fishCount(0, fish, n));
return 0;
}
```
运行此程序,它会计算并输出第一个人醒来时能看到的最多鱼的数量。注意,这个算法的时间复杂度是 O(n),其中 n 是渔网的长度。递归终止条件是当那个人无法再吃到鱼时。
阅读全文