以C++递归方式查找向量中的最大值

Find max value in a vector recursively in C++

本文关键字:最大值 向量 查找 C++ 递归 方式      更新时间:2023-10-16

我正在尝试使用一个函数来递归地查找向量中的最大值。为此,我想在 findMax 函数中测试它是否可以返回列表中最后一个值。但是最后,当列表只有一个元素时,它会返回变量的地址而不是值。这是为什么呢?

/// finding max value in a list recursively
template <typename T>
int findMax(std::vector<T> arrayVector)
{
if(arrayVector.size()==1)
{
return arrayVector[0];
}
int op1= arrayVector[0];
std::vector<T> newVector (arrayVector.cbegin() + 1, arrayVector.cend());
disPlay(newVector);
int op2= findMax(newVector);
}

/// print vector
template <typename T>
void disPlay(std::vector<T> vectorArray)
{
for (int i=0; i< vectorArray.size(); i++)
{
std::cout << vectorArray[i] << "t";
}
std::cout << "n";
}

main()
{
std::vector<int> arrayVector = {6, 8, 19, 20, 23, 41, 49, 53, 56};
std::cout << findMax(arrayVector) << endl;
return 0;
}

我运行了你的程序,它触发了几个警告,可能证明不需要的行为是int findMax(std::vector<T> arrayVector)中缺少返回值。

template <typename T>
int findMax(std::vector<T> arrayVector)
{
if(arrayVector.size()==1)
{
return arrayVector[0];
}
int op1= arrayVector[0];
std::vector<T> newVector (arrayVector.cbegin() + 1, arrayVector.cend());
disPlay(newVector);
int op2= findMax(newVector);
return op2; //<-- added return
}

我纠正了 https://wandbox.org/permlink/Kts9qs7MooG4dEQL 中的问题

现在看来还行。

使用编译器警告,它可以为您节省大量麻烦的时间。

现在,这解决了代码的问题,但我建议使用std::max_element来获取C++数据结构中的最大值。

下面是一个函数的测试示例,用于递归获取无序向量中的最大值 女巫在每次迭代中丢失最后一个元素:

template <typename T>
void findMax(std::vector<T>& arrayVector)
{
if(arrayVector.size() == 0) //stop condition
return;
int max = *std::max_element(arrayVector.begin(), arrayVector.end());
std::cout << "Max value: "<< max << std::endl;
arrayVector.erase(arrayVector.end() - 1);  //last element being deleted in every recursion
findMax(arrayVector);
}

在 https://wandbox.org/permlink/0oyGnXoQdwhl3kUJ 中签入

template<typename T>
T findMax(const std::vector<T> vec, size_t index=0){
if(index==vec.size()-1) return vec[vec.size()-1];
return ( vec[index] > findMax(vec,index+1))?vec[index]:findMax(vec,index+1) ;
}

你的代码很复杂:

  • 它实际上并没有计算向量的最大值
  • 并非所有路径都返回值
  • 您正在复制std::vector对象而没有真正的目的

STL具有抽象迭代器的优点,这使得您的尝试变得相当微不足道:

template<typename T, typename C>
T findMax(C begin, C end)
{
if (begin+1 == end)
return *begin;
else
return std::max(*begin, findMax<T,C>(begin+1, end));
}

注意:代码没有检查输入的正确性。

不能是没有 ol'std::accumulate的递归解决方案:

#include <iostream>
#include <vector>
#include <numeric>
#include <limits>
int main(int argc, char *argv[])
{
std::vector<int> arrayVector = {6, 8, 19, 20, 23, 41, 49, 53, 56};
const int max = std::accumulate(
arrayVector.cbegin(),
arrayVector.cend(),
std::numeric_limits<int>::min(),
[](int x, int y) { return x > y ? x : y; }
);
std::cout << max << 'n';
return 0;
}

Rietty 对类似问题的早期解决方案,此线程中的解决方案遵循从 0 到结尾的向量。接下来跟随从尾到 0 的向量以简化递归函数:

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
template<typename T>
T  findMax (vector<T> values, size_t end) {
if (0 == end) return values[0];
return max (findMax (values, end - 1), values[end]);
}
template<typename T>
T  inline findMax (vector<T> values) {
return findMax (values, values.size() - 1);
}
int main () {
vector<int> values = { 6, 8, 19, 20, 23, 41, 49, 53, 56 };
cout << findMax (values) << endl;
return 0;
}

简单代码:

int find_max(int a[], int length){
if (length == 0) return a[length];

return std::max(a[length-1], find_max(a, length-1));

}
#include "iostream"
#include "vector"
using namespace std;
int maxre(vector<int> array);
int main()
{
vector<int> data = {210, 800, 2,150 ,19,600};
cout << maxre(data);
return 0;
}
int maxre(vector<int> array)
{
static int index = -1;

if (array.size() == index + 1)
{
return 0;
}
else
{
index++;
int current = array[index];
int back = maxre(array);
return current > back ? current : back;
}
return 0;
}