四个数比较大小(递归解法)

今天在群里水的时候,看到有的同学提到这个问题,然后我就在电脑上自己敲了一遍。

下面说一下我的解题思路:

首先这个题目就是简单的最值问题。这个问题一般的话有两个思路:

1、定义一个数为最值,然后与其余的数进行比较然后比较,找出最值。

   2、对所有的数进行排序,然后从排序好的数里面就可以找到最值。当然排序的方法有很多

   最简单的就是利用C++的STL调用sort函数或者qsort进行排序。

   总的来说这两种方法的实质就是数之间的比较,然后来回的赋值。然后就可以找到最大的值。


解题要点:

 就这道题来说,用递归的解法与上述的解法的实质也是一样的,也需要进行比较与赋值。

 我的解题方法:就是默认第一个数是最大(小)值,然后让第一个与其余的比较,将大的值赋值给第一个数,

 继续进行比较。当一个数比其他数都大时结束递归。返回的第一个数,就是最大(小)值。


下面是我的代码:

    

#include<stdio.h>
int max(int a,int b,int c,int d);
int main()
{
	int a,b,c,d;
	while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
		printf("%d\n",max(a,b,c,d));
}
int max(int a,int b,int c,int d)
{
	int number=a;
	if(number>=b&&number>=c&&number>=d)
	{
		return number;
	}
	else
	{
		if(number<b) max(b,b,c,d);
		else if(number<c) max(c,b,c,d);
		else max(d,b,c,d);
	}
}


  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答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的解,并输出对应结果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值