C++ 递归函数中的溢出
所以我写了这个练习代码,它使用递归计算向量的最大值,出于某种原因,我在return语句中得到了溢出 代码如下:C++ 递归函数中的溢出,c++,recursion,overflow,C++,Recursion,Overflow,所以我写了这个练习代码,它使用递归计算向量的最大值,出于某种原因,我在return语句中得到了溢出 代码如下: template<typename T> T max_helper(vector<T> v, T max, int i){ T m = v[i]; cout << "Max: " << max << "\n"; if (i < v.size()-1) {
template<typename T>
T max_helper(vector<T> v, T max, int i){
T m = v[i];
cout << "Max: " << max << "\n";
if (i < v.size()-1) {
if (m > max) max_helper(v, m, ++i);
else max_helper(v, max, ++i);
}
else {
cout << "Max2: " << max;
return max;
}
}
template<typename T>
T maximum(vector<T> v){
T max = max_helper(v, 0, 0);
cout << "\nMax3: " << max;
if (max > v[v.size()-1]) return max;
else return v[v.size()-1];
}
int main() {
int seed = static_cast<int>(time(0));
srand(seed);
vector<int> v(20);
for(unsigned int i=0; i<v.size(); i++){
v[i] = 1+rand() % 100;
}
int r = maximum(v);
cout << "\n";
for (auto i: v) cout << i << " ";
cout << "\nLargest element: " << r;
return 0;
}
知道为什么会发生这种情况吗?如果i
为true
,max\u helper
不返回任何值,因此程序具有未定义的行为
你应该还些东西。例如:
template<typename T>
T max_helper(vector<T> v, T max, int i){
T m = v[i];
cout << "Max: " << max << "\n";
if (i < v.size()-1) {
if (m > max) return max_helper(v, m, ++i); // return added
else return max_helper(v, max, ++i); // return added
}
else {
cout << "Max2: " << max;
return max;
}
}
模板
T max_辅助向量(向量v,T max,int i){
tm=v[i];
无法打开编译器警告并阅读它们。您不会返回对max\u helper
的递归调用结果。旁注:v[v.size()-1]
->v.back()
如果您的编译器不是仿古编译器或不是以仿古模式编译。iv.size
是无符号的,所以1
可能会失败。如果i
为负数,它将扭曲为一个大数字。如果v
为空,v.size()-1
也将成为一个巨大的数字。有人需要对您的代码进行的每一次更改都是他们意外修复错误或注入新错误的机会。虽然感谢提示,但没有修复错误。问题是max\u helper返回到maximum。maximum返回97(Max2输出行),但最大值接收6421696到返回变量(Max3输出行).我不知道这堆腐败是从哪里来的,tho@barberchopz我添加了一个演示,其中我对您的原始代码所做的唯一更改是添加return
s。我建议您更改的结果是什么?我注意到并实现了它。没有更改,输出相同…@barberchopz您使用的编译器是什么?您是否正在运行exa与我在godbolt演示中输入的代码完全相同?抱歉,没有在if之后立即看到返回!它正在工作。非常感谢:)
template<typename T>
T max_helper(vector<T> v, T max, int i){
T m = v[i];
cout << "Max: " << max << "\n";
if (i < v.size()-1) {
if (m > max) return max_helper(v, m, ++i); // return added
else return max_helper(v, max, ++i); // return added
}
else {
cout << "Max2: " << max;
return max;
}
}