Поиск наибольшего значения в массиве с помощью рекурсии
Недавно я изучал книгу "Абстракция данных и решение проблем с помощью 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;
}