基于递归实现数组最值查找的代码简化与功能调整咨询
问题1:不使用struct对象返回最大值与次大值
可以通过输出参数实现,不需要定义struct,也不需要全局变量:在函数参数中增加两个int指针,递归过程中直接把计算出的最大值、次大值写入指针指向的地址即可。
另外需要注意:你原本的实现存在逻辑漏洞,当新元素小于当前最大值、但大于历史次大值时,次大值不会正确更新,下面的优化代码同时修复了这个问题:
#include <stdio.h> #include <limits.h> void find_max_second(int a[], int size, int *max, int *second) { // 递归终止条件:数组长度为1时,最大值为当前元素,次大值设为整数极小值 if (size == 1) { *max = a[0]; *second = INT_MIN; return; } int pre_max, pre_second; // 递归计算前size-1个元素的最大和次大 find_max_second(a, size - 1, &pre_max, &pre_second); int cur = a[size - 1]; // 比对当前元素和历史值,更新最大和次大 if (cur > pre_max) { *max = cur; *second = pre_max; } else if (cur > pre_second) { *max = pre_max; *second = cur; } else { *max = pre_max; *second = pre_second; } } int main() { int a[] = {1, 11, 4, 9, 6, 7, 8, 10}; int max, second; find_max_second(a, sizeof(a) / sizeof(a[0]), &max, &second); printf("最大值:%d\n次大值:%d\n", max, second); return 0; }
问题2:修改代码同时查找最大值和最小值
同样用输出参数的方案,递归过程中同时追踪最大值和最小值即可,实现代码如下:
#include <stdio.h> void find_max_min(int a[], int size, int *max, int *min) { if (size == 1) { *max = a[0]; *min = a[0]; return; } int pre_max, pre_min; find_max_min(a, size - 1, &pre_max, &pre_min); int cur = a[size - 1]; *max = cur > pre_max ? cur : pre_max; *min = cur < pre_min ? cur : pre_min; } int main() { int a[] = {1, 11, 4, 9, 6, 7, 8, 10}; int max, min; find_max_min(a, sizeof(a) / sizeof(a[0]), &max, &min); printf("最大值:%d\n最小值:%d\n", max, min); return 0; }
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

