以C++递归方式查找向量中的最大值
Find max value in a vector recursively in C++
我正在尝试使用一个函数来递归地查找向量中的最大值。为此,我想在 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;
}
相关文章:
- 以C++递归方式查找向量中的最大值
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如何修复错误:使用向量查找最小值和最大值进行合并排序
- 求长向量的最小值和最大值
- 在二维向量的每一列中查找最大值
- 向量中的最大值
- 从向量中提取最小值、最大值和中位数的最有效方法是什么
- 在向量向量中找到 Point3f 的最大值
- SSE2 内部函数 - 找到两个无符号短向量的最大值
- 使用算法查找自定义数据向量中的最大值和最小值
- 找到两个向量数组的组合,该数组的总和是 c++ 中所有其他组合的最大值
- 如何在不使用min_element C++的情况下找到向量中的最小值和最大值<double>
- 获取向量<float>中 k 个最大值的 indize 的有效方法
- 将向量用于负最大值算法 c++ 的问题
- 求向量的奇数位置最大值(以C++为单位)
- 在对象向量中查找最大值
- 一个模板函数,用于获取向量中的最大值及其相应的索引
- 如何找到向量的统计量?最大值/最小值、模式、中位数、平均值
- 从向量向量中的列中获取最小值和最大值