функция, которая работает с массивами - PullRequest
0 голосов
/ 16 декабря 2018

Мне нужна ваша помощь, чтобы написать функцию, которая выполняет следующие действия:

Получает 2 указателя (тип double);

одна указывает на первый элемент массива, а другая - за массивом.Этот указатель не может быть разыменован.

Если указатели указывают на два смежных элемента массива, выходным значением является значение первого указателя.В противном случае функция вызывается от первого элемента к элементу посередине и от этого среднего элемента до конца, причем из этих двух значений выводится более высокое значение.

Индексирование запрещено (да, это домашнее задание).Также этот тип вещей запрещен -> * (p + 1).Это должно работать точно так, как описано (если нет, я не получаю очков).

Я действительно надеюсь, что мне удалось сделать это понятным, так как я даже не понимаю это сам?Мне сказали, что это очень просто, может быть написано примерно в 10 строк кода, но я просто не могу освоить это?Я знаю, как написать обычную функцию, которая находит обычное максимальное число, но это не совсем то, о чем просит эта проблема ...

Вот несколько примеров того, что должно работать:

double arr[] = {4.3, 15.1, 2.2, -3.4, 18.1, 1.1, 3.0};
printf("%g", parallel_max(arr, arr+7));

ожидаемый результат: 18,1

double arr[] = {4.3, 15.1, 2.2, 18.2, -3.4, 1.1, 3.0};
printf("%g", parallel_max(arr, arr+7));

ожидаемый результат: 18,2

double arr[] = {3, 1, 2};
printf("%g", parallel_max(arr, arr+3));

ожидаемый результат: 3

double arr[] = {42.42};
printf("%g", parallel_max(arr, arr+1));

ожидаемый результат: 42,42

помогите пожалуйста?

1 Ответ

0 голосов
/ 16 декабря 2018

Если я понял вашу домашнюю работу, вы хотите рекурсивное решение;где максимум массива с 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;
}
...