Есть ли способ использовать указатели в рекурсии, чтобы найти минимум массива? - PullRequest
0 голосов
/ 29 мая 2018

Прежде всего, я начинающий программист, поэтому заранее прошу прощения, если этот вопрос кажется немного тупым.

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

int findMinRec(int A[], int n)
{
    if (n == 1)
        return A[0];
    return min(A[n-1], findMinRec(A, n-1));
}

Тем не менее, я пытаюсь выяснить метод, используя рекурсию и указатель.Примерно так:

const int *min(const int arr[], int arrSize) {

Есть ли простой способ сделать это?Я попытался переработать стандартным способом, но я просто не могу понять, как это сделать с помощью указателя.

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Здесь ключ к пониманию того, что A - это указатель.Так что если вы хотите вернуть указатель вместо значения, просто сделайте это.Измените return A[0]; на return A;.

0 голосов
/ 29 мая 2018

Вы просто должны настроить возврат указателя вместо значения, то есть вы не можете использовать std::min().Разверните его и настройте его.
Я также переименовал вашу функцию, чтобы было очевидно, что она возвращает указатель на наименьший элемент, вместо того, чтобы быть ограниченной повторной реализацией std::min().
Еще одним важным моментом является ее создание.хвостовая рекурсия, поэтому компилятор может легко оптимизировать его до итеративного и исключить добавление фреймов стека.

const int *min_p(const int arr[], int arrSize) {
    if (arrSize == 1)
        return arr;
    return min_p(arr + (arr[arrSize - 1] < *arr), arrSize - 1);
}

Также интересно, как ваш исходный код, так и min_p() приводят к UB, если arrSize не соответствуетположительный ...

0 голосов
/ 29 мая 2018

Попробуйте что-то вроде этого:

const int *_min(const int *arr, int arrSize)
{
    if (arrSize == 1)
    {
        return arr;
    }
    const int *t = _min(arr + 1, arrSize - 1);
    if (*t < *arr)
    {
        return t;
    }
    return arr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...