You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于递归实现数组最值查找的代码简化与功能调整咨询

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:27:01