c语言母牛的故事分析函数解决,[递归]母牛的故事-三种题解(C语言代码)

###### **分析问题**

看到这道题,如果没有明显的思路

可以试着列出一些简单的数据

| 年份 |1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |

| 总数 | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 |

| 成牛 | 1 | 1 | 1 |1 | 2 | 3 | 4 | 6 |

`成牛就是可以生育的牛`

那么我们就能发现显然的规律了.

假设第N年的牛的总数为F(n)

那么前四年中 **F(n) = n**

后面的年份里 **F(n) = F(n-1) + F(n-3)**

也很好理解,某年的牛的总数量=去年的总数+成牛所生的数量

而成牛的数量会正好与前面第三年牛总数相等,这是小牛长大的时间

那么知道了边界和递推关系,我们就可以用递归解决问题.

###### 第一种解法-递归

```c

#include//递归函数

int dfs(int year){

if(year<5)//边界

return year;

//递推式

return dfs(year-1)+dfs(year-3);

}

int main()

{

int input[20]={0};//存储输入的数

int i=0,j=0;

int n;

//输入部分

//输入部分本来应该动态分配内存,但我懒

//而且这个也确实占不到多少内存

while(1){

scanf("%d",&n);

if(n == 0) break;

input[i]=n;

i++;

}

//输出部分

while(i--){

printf("%d\n",dfs( input[j++] ));

}

return 0;

}

```

递归虽然简单,但是,时间复杂度极高

我试了一下 第55年 在我的电脑上算了大概有1s

这样的答案可能会超时,所以要改进.

###### 第二种解法-带有记忆化搜索的递归

#include//记忆化搜索

int answer[56]={0}; //存储每年的答案

//因为不可能某一年为0,所以以0判断空

int dfs(int year){

if(year<5)

return year;

//后面的年份返回的都将是数组中的年份

if( answer[year]==0 )

answer[year]=dfs(year-1)+dfs(year-3);

return answer[year];

}

int main()

{

int input[20]={0};

int i=0,j=0;

int n;

//输入部分

while(1){

scanf("%d",&n);

if(n == 0) break;

input[i]=n;

i++;

}

//输出部分

while(i--){

printf("%d\n",dfs( input[j++] ));

}

return 0;

}

###### 第三种解法-动态规划

/*动态规划就是在现有答案可以利用

之前的结果推断的情况下,利用数组

来存取答案,将所有答案动态解出 */

#includeint main()

{

int input[20]={0};

int answer[56]={0};

int i=0,j=0;

int n;

//输入数据

while(1){

scanf("%d",&n);

if(n == 0) break;

input[i]=n;

i++;

}

//计算答案

//动态规划代码:

for(int i=1;i<5;i++)

answer[i]=i;

for(int i=5;i<56;i++)

answer[i]=answer[i-1]+answer[i-3];

//与递归的代码相似,但利用循环来解决

//answer[year]=dfs(year-1)+dfs(year-3);

//输出数据

while(i--){

printf("%d\n",answer[input[j++]]);

}

return 0;

}

都看到这里了,不点个赞

刷个666码?

0.0分

8 人评分

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 24 点游戏是一种通过使用 4 个数字和 4 种运算符(加、减、乘、除)来得到 24 的益智游戏。 使用递归函数解决 24 点问题的方法是,对于给定的 4 个数字,枚举所有可能的运算顺序,并通过递归调用来解决子问题。 举个例子,假设我们要解决的 4 个数字分别是 a、b、c、d,我们可以先枚举第一个数字和第二个数字之间的运算符,然后递归调用函数解决子问题,即解决: - (a + b), c, d - (a - b), c, d - (a * b), c, d - (a / b), c, d 对于每个子问题,我们再枚举第三个数字和第四个数字之间的运算符,并递归调用函数解决子问题,即解决: - ((a + b) + c), d - ((a + b) - c), d - ((a + b) * c), d - ((a + b) / c), d 以此类推,直到我们递归到只剩下一个数字时,如果该数字为 24,则说明找到了一组解,如果不是 24,则继续枚举下一组运算顺序。 这是一种基本的递归解法,具体的实现还可以加上一些优化,比如剪枝、去重等。 以下是使用 C 语言实现 ### 回答2: 递归函数是一种将问题分解成更小的子问题来解决复杂问题的方法。在解决"24点"的问题中,我们可以使用递归函数来生成所有可能的计算表达式,并检查是否存在等于24的解决方案。 以下是一种用C语言编写的递归函数解决"24点"问题的实现: ```c #include <stdio.h> #include <stdbool.h> bool solve24(int nums[], int n) { // 判断是否只剩下一个数,即是否已找到24点解决方案 if (n == 1) { return nums[0] == 24; } // 生成所有可能的组合进行计算 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i != j) { // 创建一个新数组用于存储剩余的数字 int newNums[n - 1]; int newIndex = 0; for (int k = 0; k < n; k++) { if (k != i && k != j) { newNums[newIndex] = nums[k]; newIndex++; } } // 将两个数进行四则运算操作,得到新的数字 int num1 = nums[i]; int num2 = nums[j]; int result; // 加法 result = num1 + num2; if (solve24(newNums, n - 1) || result == 24) { return true; } // 减法 result = num1 - num2; if (solve24(newNums, n - 1) || result == 24) { return true; } // 乘法 result = num1 * num2; if (solve24(newNums, n - 1) || result == 24) { return true; } // 除法 result = num1 / num2; if (solve24(newNums, n - 1) || result == 24) { return true; } } } } return false; // 未找到一个等于24的解决方案 } int main() { int nums[] = {4, 6, 8, 9}; // 示例输入数组 int n = sizeof(nums) / sizeof(nums[0]); if (solve24(nums, n)) { printf("可以得到24点的解决方案\n"); } else { printf("无法得到24点的解决方案\n"); } return 0; } ``` 该代码首先定义了一个递归函数`solve24`,该函数接受一个整数数组`nums`和数组大小`n`作为输入。递归函数通过生成所有可能的两个数进行四则运算,并生成新的数组来递归解决更小的子问题。最后,利用`main`函数输入一个示例数组并调用递归函数解决24点的问题。 注意:以上代码仅提供了一种解决"24点"问题的思路,具体实现可能有不同的方法和算法。 ### 回答3: 24点游戏是一种数学游戏,在给定的4个数字中通过使用加、减、乘、除运算符以及括号,最终得到结果为24。递归函数可以用来解决这个问题。下面是一个用C语言实现的递归函数代码。 ``` #include <stdio.h> #define EPSILON 1E-6 int dfs(double* nums, int count) { if (count == 1 && fabs(nums[0] - 24.0) < EPSILON) { return 1; // 找到结果为24的解 } if (count == 1) { return 0; // 不存在结果为24的解 } double next_nums[4]; for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { int next_count = count - 1; int index = 0; for (int k = 0; k < count; k++) { if (k != i && k != j) { next_nums[index++] = nums[k]; } } // 加法运算 next_nums[next_count] = nums[i] + nums[j]; if (dfs(next_nums, next_count)) { return 1; } // 减法运算 next_nums[next_count] = nums[i] - nums[j]; if (dfs(next_nums, next_count)) { return 1; } next_nums[next_count] = nums[j] - nums[i]; if (dfs(next_nums, next_count)) { return 1; } // 乘法运算 next_nums[next_count] = nums[i] * nums[j]; if (dfs(next_nums, next_count)) { return 1; } // 除法运算 if (nums[j] != 0) { next_nums[next_count] = nums[i] / nums[j]; if (dfs(next_nums, next_count)) { return 1; } } if (nums[i] != 0) { next_nums[next_count] = nums[j] / nums[i]; if (dfs(next_nums, next_count)) { return 1; } } } } return 0; // 不存在结果为24的解 } int main() { double nums[4]; printf("请输入4个数字:"); for (int i = 0; i < 4; i++) { scanf("%lf", &nums[i]); } if (dfs(nums, 4)) { printf("存在结果为24的解\n"); } else { printf("不存在结果为24的解\n"); } return 0; } ``` 该代码通过递归实现了对4个数字的所有可能运算组合,然后判断结果是否为24。通过输入4个数字,程序能够判断是否存在结果为24的解,并输出对应结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值