【发布时间】: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);
}
我有几个疑问:
- 这个可以更简单,应该能够返回最大值和 不使用结构对象的第二个最大值。
- 如何更改上述代码以从数组中找到最大值(确实如此)和最小值
【问题讨论】:
-
为此特定目的使用递归是个坏主意。在许多方面,只需对数组进行一次迭代就会更有效率。使用全局变量来存储函数的结果也是糟糕的设计。更好的方法是为最高和最低编写单独的函数,或者在指针参数中返回多个结果,或者只是对数组进行排序。
-
@Someprogrammerdude:问题被标记为 C。
-
@Cheatah:线性尾递归很好地捕获了数组上的迭代。
-
你的算法是错误的。对于
{10, 11, 1},它返回{11,1},这不是最大值和第二最大值的有效对。看起来代码实际上返回了数组的最小值和最大值。 -
@Cheatah,多次扫描阵列可能会使很多缓存失效。它可能会降低性能。如果可能的话,最好一次找到两个统计数据
标签: c