繁体   English   中英

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

[英]Finding largest value in array using recursion

我最近一直在研究“使用 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;

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

而且我想不出具有“多路径递归”视角的算法。

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

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

演示

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

我建议您使用一个助手 function 调用您的最大值 function ,如下所示:

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

递归算法只是将数组一分为二并递归地找到最大值,然后将两者进行比较并返回最大值。 您需要做的是使用边界 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM