使用递归查找数组中的最大值
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());
注意这里的first
和last
代表一个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;
}
我最近一直在学习“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());
注意这里的first
和last
代表一个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;
}