在 C++ 中,仅使用递归来提取向量中的最大元素

using recursion only to extract the maximum elements in a vector in c++

本文关键字:向量 提取 元素 归来 递归 C++      更新时间:2023-10-16

我正在尝试使用递归在 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];
}