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

Rut*_*lak 2 c++ arrays algorithm recursion multipath

我最近一直在学习“数据抽象和使用 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Evg*_*Evg 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

演示

请注意,这里的firstlast表示半开区间 [first, last),符合 C++ 标准库中广泛使用的约定。