[英]To find minimum and maximum value from a given array using divide and conquer algorithm
[英]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);
}
我有几个查询:
递归在寻找最大值或最小值方面很好(假设它对任何事情都有好处)。
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);
}
回答你的第一个问题:
这可以变得更简单吗,应该能够在不使用 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_a
和out_b
来存储结果。 这就是您在主 function 中使用它的方式:
int a; int b;
my_function(array, size, &a, &b);
printf("First %d, second %d", a, b);
您创建了两个变量a
和b
,它们将保存结果并使用&
运算符将它们的地址传递给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.