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)
但是,在我阅读了问题的描述后,有人说“你必须用多路径递归来解决这个问题”。为了更好地理解我把问题的截图:

而且我无法从“多路径递归”的角度想出算法。
在中间拆分数组,然后为每一半调用函数:
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)
请注意,这里的first和last表示半开区间 [first, last),符合 C++ 标准库中广泛使用的约定。