繁体   English   中英

使用递归从数组中找到最大值和最小值

[英]find maximum and minimum value from array using recurrsion

我写了一个代码来使用递归找到最大值和第二最大值:

struct max_min
{
        int max;
        int min;
}obj;

int find_l_m(int a[], int size)
{
        int next_element;

        if (size == 1)
                return a[0];

        next_element = find_l_m(a, size-1);

        if (a[size-1] > next_element) {
                obj.max = a[size-1];
                obj.min = next_element;

                return a[size-1];
        } else {
                obj.max = next_element;
                obj.min = a[size-1];

                return next_element;
        }

}

int main()
{
        int a[] = {1, 11, 4, 9, 6, 7, 8, 10};

        find_l_m(a, sizeof(a) / sizeof(a[0]));
        printf("%d\n%d\n", obj.max, obj.min);
}

我有几个查询:

  1. 这可以变得更简单吗,应该能够在不使用 struct object 的情况下返回 max 和 second max。
  2. 如何更改上面的代码以从数组中找到最大值(确实如此)和最小值

递归在寻找最大值或最小值方面很好(假设它对任何事情都有好处)。

typedef struct 
{
        int max;
        int min;
}obj;

int max_min(int minmax, int arr[], size_t size)
{
    if(size == 1) return *arr;
    else 
    {
        int result = max_min(minmax, arr + 1, size - 1);
        if(minmax) return result <= *arr ? *arr : result;
        else return result >= *arr ? *arr : result;
    }
}

obj test(int *arr, size_t size)
{
    return (obj){max_min(1, arr, size), max_min(0, arr, size)};
}

int main(void)
{
    int arr[] = {1,4,9,3,2,-4,0,2,3};
    obj o = test(arr, sizeof(arr)/sizeof(arr[0]));

    printf("max = %d min = %d\n", o.max, o.min);
}

https://godbolt.org/z/zGrYMYjx7

回答你的第一个问题:

这可以变得更简单吗,应该能够在不使用 struct object 的情况下返回 max 和 second max。

有几种方法可以从 C 中的一个 function 返回两个(或更多)值。正如您所指出的,第一个是使用struct ,这样:

// Define a struct holding two integers 
struct Pair_of_int {
    int a;
    int b;
 };


// Define a function returning a `PairOfInt`
struct Pair_of_int my_function(int[] a, int size) {
     struct Pair_of_int result;
     // Do some work
     result.a = /*...*/;
     result.b = /*...*/;
     return result;
 }

这就是您在主 function 中调用这样的 function 的方式:

struct Pair_of_int pair = my_function(...);
printf("First %d, second %d", pair.a, pair.b);

请注意,这并不完全是您在显示的代码中所做的。 在您的代码中,您有一个由 function 更新的结构max_min全局实例。您想要的是使用该结构作为 function 的返回值,如上所示。

另一种方法是使用指针返回多个值 在这里,如果你想要两个int s,你必须定义你的 function 来接受两个指向int的指针作为 arguments 并使用它们来存储值。

void my_function(int[]a, int size, int* out_a, int* out_b) {
    // Do some work
    *out_a = /*...*/;
    *out_b = /*...*/;
}

在这里,您可以看到 function 没有返回任何内容。 相反,它使用两个指针out_aout_b来存储结果。 这就是您在主 function 中使用它的方式:

int a; int b;
my_function(array, size, &a, &b);
printf("First %d, second %d", a, b);

您创建了两个变量ab ,它们将保存结果并使用&运算符将它们的地址传递给my_function

如何更改上面的代码以从数组中找到最大值(确实如此)和最小值

如果您让第一个案例正常工作,这应该不会太难。 您必须分别跟踪这两个值。 您可能需要向 function 添加更多的 arguments 才能使其递归工作。

这可以变得更简单吗,应该能够在不使用 struct object 的情况下返回 max 和 second max。

您可以将具有单个值的最小-最大结构的更新分解为单独的 function。然后,您可以将递归 function 变成单行代码。

如何更改上面的代码以从数组中找到最大值(确实如此)和最小值

那么,你需要:

  • 返回一个struct max_min
  • 正确初始化您的struct max_min (例如,对于空数组的情况;适当地定义语义)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM