我需要您的帮助来编写执行以下操作的函数:
它接收2个指针(类型为double);
一个指向数组的第一个元素,另一个指向数组的后面。不能取消引用该指针。
如果指针指向两个相邻的数组元素,则输出为第一个指针的值。否则,从第一个元素到中间的元素,再从中间的元素到结尾的函数,从这两个值中调用更高的函数。
禁止索引编制(是的,这是家庭作业)。同样,这种类型的事物也是禁止的-> *(p + 1)。它必须完全按照描述的方式工作(如果没有,我将得不到任何积分)。
我真的希望我设法使它易于理解,因为我自己什至没有得到它?有人告诉我它非常简单,可以用10行代码编写,但是我无法理解它吗?我知道如何编写能找到通常最大数量的通常函数,但这显然不是这个问题所要的……
以下是一些应该起作用的示例:
{
"header": {
"PPQ": 480,
"timeSignature": [
4,
4
],
"bpm": 120,
"name": ""
},
"startTime": 0.10520833333333333,
"duration": 2.8406249999999984,
...
预期输出:18.1
double arr[] = {4.3, 15.1, 2.2, -3.4, 18.1, 1.1, 3.0};
printf("%g", parallel_max(arr, arr+7));
预期输出:18.2
double arr[] = {4.3, 15.1, 2.2, 18.2, -3.4, 1.1, 3.0};
printf("%g", parallel_max(arr, arr+7));
预期输出:3
double arr[] = {3, 1, 2};
printf("%g", parallel_max(arr, arr+3));
预期输出:42.42
请帮助?
答案 0 :(得分:1)
如果我了解您的作业,则需要递归解决方案;其中具有1个元素的数组的最大值是该元素,而具有1个以上元素的数组的最大值递归地是左半部分的最大值或右半部分的最大值。
// NOT TESTED
double parallel_max(double *a, double *b) {
if (b - a == 1) return *a; // they're consecutive
double *c = a + ((b - a) / 2); // c points to middle
double left = parallel_max(a, c);
double right = parallel_max(c, b);
return (left > right) ? left : right;
}