Поиск наибольшего значения в массиве с помощью рекурсии

Недавно я изучал книгу "Абстракция данных и решение проблем с помощью C++", однако в какой-то момент я застрял.

Я нахожусь в главе о рекурсии и столкнулся с проблемой: "Найти наибольшее значение в массиве". Как вы знаете, я должен решить эту проблему с точки зрения рекурсии, и на самом деле я уже решил это с помощью этого алгоритма;

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

int largestValue(int anArray[], int first , int last){
int value;

// base case
if(first == last){
    value = anArray[first];
}
else if(anArray[first]>anArray[first+1]){
    anArray[first + 1] = anArray[first];
    value = largestValue(anArray, first + 1, last);
}else{ // anArray[first] < anArray[first + 1]
    value = largestValue(anArray, first + 1, last);
}
return value;

НО после того, как я прочитал описание проблемы, говорится: "Вы должны решить эту проблему с помощью многопутевой рекурсии". Для лучшего понимания ставлю скриншот проблемы:

И я не мог понять алгоритм с точки зрения "многолучевой рекурсии".

3 ответа

Решение

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

int largestValue(int arr[], int size){
    int middle = (size - 1)/2;
    int first_max = largestValue(arr, 0, middle);
    int second_max = largestValue(arr, middle + 1, largest - 1);
    if(first_max < second_max){
       return second_max;
    }
    return first_max;
}

Разделите массив посередине, затем вызовите функцию для каждой половины:

template<class Random_it>
// typename std::iterator_traits<Random_it>::value_type
auto recursive_max(Random_it first, Random_it last) {
    assert(first != last);
    if (last - first == 1)
        return *first;
    const auto mid = first + (last - first) / 2;
    const auto l_max = recursive_max(first, mid);
    const auto r_max = recursive_max(mid,   last);
    return (r_max > l_max) ? r_max : l_max;
}

Пример использования:

std::vector<int> vec{/* init values */};
const auto max = recursive_max(vec.begin(), vec.end());

Демо

Обратите внимание, что здесь first а также lastпредставляют собой полуоткрытый интервал [first, last)в соответствии с соглашением, широко используемым в стандартной библиотеке C++.

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

Простым решением было бы следующее:

int largestValue(int anArray[], int first, int last) {
    if (first == last) {
        return anArray[first];
    }
    int middle = (first+last)/2;
    int left = largestValue(anArray, first, middle);
    int right = largestValue(anArray, middle+1, last);
    int max;
    if (left > right) {
        max = left;
    } else {
        max = right;
    }
    return max;
}
Другие вопросы по тегам