使用递归查找数组中的最大值

Finding largest value in array using recursion

我最近一直在学习“Data Abstraction and Problem Solving with 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;

但是,在我阅读了问题的描述之后,有人说“你必须用多路径递归来解决这个问题。” 为了更好地理解,我放了问题的截图:

而且我无法从“多路径递归”的角度找出算法。

在中间拆分数组,然后为每一半调用函数:

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());

Demo

注意这里的firstlast代表一个half-open interval[first, last),符合C++标准库中广泛使用的约定

我建议您使用像这样调用最大值函数的辅助函数:

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;
}

递归算法只是将数组一分为二,递归找到最大值,然后比较两者,returns取最大值。 你需要做的是使用边界 first 和 last 来告诉你数组的哪一部分要计算最大值。

一个简单的解决方案如下:

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;
}