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

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

Функция должна вызываться из первого элемента массива в середину, а затем из среднего элемента в конец в конце, а затем функция должна возвращатьзначение этих двух, которое больше.

double max_element(double *p1, double *p2)
{
    double from_first_to_middle = max_element(p1, (p1 + p2) / 2 + p1);

    double from_middle_to_last = max_element((p1 + p2) / 2 + p1, p2);

    if(from_first_to_middle > from_middle_to_last)
    {
        return from_first_to_middle;
    }
    else
    {
        return from_middle_to_last;
    }
}

Но когда я пытаюсь запустить этот код, он выдает ошибку

error: invalid operands to binary + (have ‘double *’ and ‘double *’)

Итак, я подумал, что я должен разыменовать эти указателипоскольку я не могу выполнить эти операции с адресами, на которые они указывают, но это все равно не работает.

Кто-нибудь может помочь?

Спасибо!

Ответы [ 4 ]

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

Если вместо использования p1 и p2 вы должны будете использовать имена указателей, соответствующие вашим именам переменных from_first_to_middle и from_middle_to_last, все может стать более понятным:

double max_element(double *first, double *last)
{
    if (last - first == 1)
    {
        return *first; // base case of our recursion
    }

    double *middle = first + (last - first) / 2;

    double from_first_to_middle = max_element(first, middle);

    double from_middle_to_last = max_element(middle, last);

    if (from_first_to_middle > from_middle_to_last)
    {
        return from_first_to_middle;
    }

    return from_middle_to_last;
}

Хотяс обычными числами (p1 + p2) / 2 совпадает с p1 + (p2 - p1) / 2, что логика не работает с указателями из-за отсутствия добавления указателя.Даже тогда ваша формула: (p1 + p2) / 2 + p1 также неверна для обычных чисел.

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

Может быть, это поможет.

double max_element(double *p1, double *p2)
{
    double from_first_to_middle = max_element(p1, (double *)((size_t)(p2 - p1) / 2) + p1);

    double from_middle_to_last = max_element((double *)((size_t)(p2 - p1) / 2 + 1) + p1, p2);

    if (from_first_to_middle > from_middle_to_last)
    {
        return from_first_to_middle;
    }
    else
    {
        return from_middle_to_last;
    }
 }
0 голосов
/ 21 декабря 2018

Я думаю, что ваш код не должен заканчиваться, потому что у вашего возврата есть некоторые проблемы.если p1 + 1 == p2, то рекурсия продолжает повторяться.Вы должны добавить строку

if ((p1+1) == p2)
 return *p1;

в начале.

double max_element(double* p1, double* p2){
    if ((p2 - p1) <= 0)
        exit(1);
    if ((p1+1)==p2)
        return *p1;
}
0 голосов
/ 21 декабря 2018

Указатели не являются целыми числами.Для них определено всего несколько арифметических операций, и указатель + добавление указателя и деление указателя / целого числа не входят в их число (что бы они значили?).Вы можете добавить целое число к указателю, чтобы получить другой указатель, смещенный от оригинала на указанное количество целевых объектов.И наоборот, вы можете вычесть один указатель из другого, чтобы получить целое число, представляющее число целевых объектов между двумя указанными.Существуют ограничения на обе эти операции, но они не должны мешать тому, что вам нужно делать.

Вы можете использовать вышеупомянутые виды арифметических операций с указателями вместе с некоторой целочисленной (-только) арифметикой для вычисления указателя средней точкинеобходимо для вашей функции.Детали оставлены в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...