【发布时间】:2020-01-16 14:21:09
【问题描述】:
我写了下面的函数来计算一个向量中所有元素的总和,使用的是divide et impera方法
int Sum(std::vector<int> v, int left, int right)
{
int mid = (left + right) / 2;
if (left >= right)
return v[mid];
else
return Sum(v, left, mid - 1) + Sum(v, mid + 1, right);
}
//in main:
vector <int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << Sum(v, 0, v.size() - 1);
但是,在给定的示例中,它输出 37 而不是 55。我使用调试器检查了它,它似乎跳过了某些数字。我尝试将left >= right 更改为left > right,但它仍然给了我一个错误的答案(56),尽管我认为从逻辑上讲它应该是left => right。
代码有什么问题?
【问题讨论】:
-
下次,请将您的代码发布为minimal reproducible example,例如this example。您的代码缺少
include标头,我们不知道main是否缺少其他相关内容。如果你让别人来填补这些空白,那么填写的代码可能与你正在编译和运行的代码不匹配。 -
Sum(v, left, mid - 1) + Sum(v, mid, right);这适用于O(n^2),因为您复制向量,通过 const 引用传递它:int Sum(const std::vector<int>& v, int left, int right) -
似乎是时候学习如何使用 调试器 在监控变量及其值的同时逐语句执行代码了。在纸上调试时记下笔记也很有用。
标签: c++ recursion divide-and-conquer