在 C++ 中,仅使用递归来提取向量中的最大元素
using recursion only to extract the maximum elements in a vector in c++
我正在尝试使用递归在 c++ 中提取向量中的最大元素,函数中只有一个参数:
int maxR(vector<int> v) {
if (v.size() != 1) {
if (v[v.size()-1] > v[v.size()-2]) {
v[v.size()-2] = v[v.size()-1];
v.pop_back();
/*check what happens to v during recursion: cout << v[v.size()-1] <<endl;*/
return maxR(v);
}
else {
v.pop_back();
return maxR(v);
}
return v[0];
}
}
int main() {
vector<int> v = { 3,16,2,4,7,11,19 };
cout << maxR(v);
}
所以我希望它会返回数字 19,但由于某些原因,它返回我一个零,即 0。
所以我添加了这一行:
cout << v[v.size()-1] <<endl;
看看递归期间发生了什么,我得到了这个: 19 19 19 19 19 19 0
所以我不确定我的代码出了什么问题?
有人可以指出错误吗?
将 return 语句移到它后面的括号后面。
通过更好地缩进,您可以更好地了解代码中的控制流。
int maxR(vector<int> v) {
if (v.size() != 1) {
if (v[v.size()-1] > v[v.size()-2]) {
v[v.size()-2] = v[v.size()-1];
v.pop_back();
return maxR(v);
}
else {
v.pop_back();
return maxR(v);
}
return v[0];
}
// No return statement when v.size() is equal to 1.
}
现在您可以看到,当v.size()
等于 1 时,您的函数会下降到没有return
语句的末尾。因此,您的代码具有未定义的行为。试图理解"为什么函数返回 0"是没有意义的?它可以返回任何东西,它可以炸毁程序,等等。
修复很简单,我怀疑您会通过适当的缩进清楚地看到它。将return v[0];
线移动到if
块的末尾。
int maxR(vector<int> v) {
if (v.size() != 1) {
if (v[v.size()-1] > v[v.size()-2]) {
v[v.size()-2] = v[v.size()-1];
v.pop_back();
return maxR(v);
}
else {
v.pop_back();
return maxR(v);
}
}
// The correct place for the return statement.
return v[0];
}
FWIW,对功能的改进将是:
int maxR(vector<int> v) {
if (v.size() != 1) {
if (v[v.size()-1] > v[v.size()-2]) {
v[v.size()-2] = v[v.size()-1];
}
// No need to duplicate these lines.
v.pop_back();
return maxR(v);
}
// The correct place for the return statement.
return v[0];
}
相关文章:
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 如何创建一个函数来提取向量内部字符串中的字段?
- 将不同类型的模板参数包提取到双精度向量中会产生警告
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 如何从多维向量中提取数据
- 在 C++ 中,仅使用递归来提取向量中的最大元素
- 将张量的"lower diagonal"映射到矩阵,作为将矩阵的下三角形部分提取到向量的推广
- C :如何将多个URL从网站HTML提取到向量
- 从向量中提取最小值、最大值和中位数的最有效方法是什么
- 制作一个对的向量,对其进行排序,然后从中提取向量
- 从元组中提取向量
- 读取文件后提取子向量时的C 错误
- 从坐标向量中提取坐标并保存到文件
- 将一个向量(从向量的一个向量中提取)分配给另一个向量时出错,运算符为
- 提取向量的其他元素
- 在向量中查找值,并从该位置提取子向量
- 使用 std::unique_copy 从向量中提取不区分大小写的唯一字符串
- 如何从Eigen中的索引向量中提取子向量(Eigen::Vector)
- 使用迭代器从向量中提取子向量
- 可视化地从c++向量中指定的索引中提取元素