【问题标题】:find maximum and minimum value from array using recurrsion使用递归从数组中找到最大值和最小值
【发布时间】:2021-10-03 05:51:48
【问题描述】:

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

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. 这个可以更简单,应该能够返回最大值和 不使用结构对象的第二个最大值。
  2. 如何更改上述代码以从数组中找到最大值(确实如此)和最小值

【问题讨论】:

  • 为此特定目的使用递归是个坏主意。在许多方面,只需对数组进行一次迭代就会更有效率。使用全局变量来存储函数的结果也是糟糕的设计。更好的方法是为最高和最低编写单独的函数,或者在指针参数中返回多个结果,或者只是对数组进行排序。
  • @Someprogrammerdude:问题被标记为 C。
  • @Cheatah:线性尾递归很好地捕获了数组上的迭代。
  • 你的算法是错误的。对于{10, 11, 1},它返回{11,1},这不是最大值和第二最大值的有效对。看起来代码实际上返回了数组的最小值和最大值。
  • @Cheatah,多次扫描阵列可能会使很多缓存失效。它可能会降低性能。如果可能的话,最好一次找到两个统计数据

标签: c


【解决方案1】:

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

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

【讨论】:

  • @0___________,想知道,我们是否在 {max_min(1, arr, size), max_min(0, arr, size)};} 中存储结构成员?,它是第一个吗? max_min(1, arr, size) 从数组中返回最大值,对吧?
【解决方案2】:

回答你的第一个问题:

这个可以更简单吗,应该可以在不使用结构对象的情况下返回最大值和第二个最大值。

有几种方法可以从 C 中的一个函数返回两个(或多个)值。如您所述,第一种方法是使用 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;
 }

这就是您在主函数中调用此类函数的方式:

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

请注意,这与您在显示的代码中所做的并不完全相同。在您的代码中,您有一个结构 max_min 的 global 实例,该实例由函数更新。你要的是用结构体作为函数的返回值,如上图。

另一种方式是use pointers to return multiple values。在这里,如果您想要两个 ints,您必须定义您的函数以接受两个指向 int 的指针作为参数并使用它们来存储值。

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

在这里,您可以看到该函数不返回任何内容。相反,它使用两个指针out_a 和out_b 来存储结果。这就是您在主函数中使用它的方式:

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

您创建两个变量a 和b,它们将保存结果并使用&amp; 运算符将它们的地址 传递给my_function。

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

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

【讨论】:

    【解决方案3】:

    这个可以更简单吗,应该可以在不使用结构对象的情况下返回最大值和第二个最大值。

    您可以将具有单个值的 min-max 结构的更新分解为单独的函数。然后,您可能可以将递归函数变成单行函数。

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

    嗯,你需要:

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

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2011-08-01
      • 2016-06-10
      • 1970-01-01
      • 2021-03-23
      • 2016-08-12
      • 2015-09-03
      • 2014-12-12
      • 2018-07-04
      相关资源
      最近更新 更多