我有10个文本文件,其中包含一列1,-1,0。 我想设置一个组合,它总结每个文件的元素。
例如,如果我想查看10个文件中的2个文件的所有组合,我将在下面创建2个循环: 双倍数;
for(int i;i=0;i<n;i++){
for(int j;j=i;j<n;j++){
sum += x[i]+x[j];
}
}
另一个例子,如果我想看到10个文件中3个文件的所有组合,我会在下面创建3个循环:
for(int i;i=0;i<n;i++){
for(int j;j=i;j<n;j++){
for(int k;k=j;k<n;k++)
sum += x[i]+x[j]+x[k];
}
}
}
依此类推,如果我想在10个文件中看到组合x文件,我会创建x循环。
我的问题是:我正在寻找一种通过选择x来确定循环次数的算法。如果x = 2,那么我创建2个循环,如果x = 3,那么我创建3个循环,如果x = 4,那么我创建4个循环,...或者可能有另一种方式。 非常感谢
答案 0 :(得分:1)
我不确定您提供的代码是否真的有效for (int i;i=0;i<n;++i)
,最有可能是for (int i=0;i<n;++i)
。虽然如此,你正在寻找某种递归。
我假设您已将此数据存储在std::vector
中,而不是我建议您创建2D变体std::vector<std::vector<int>>
。
递归需要2个元素:停止条件和递归:
void function(int &sum, const std::vector<std::vector<int>> &data, std::size_t outerLevel, std::size_t innerLevel, int intermediate) {
// Stop condition of recursion,
// if we don't have any elements any more,
// the intermediate is our final result.
if (outerLevel == data.size()) {
sum += intermediate;
return;
}
// Recursing
const std::vector<int> &subData = data[outerLevel];
for (auto i = innerLevel; i < subData.size(); ++i) {
function(sum,
data,
outerLevel+1, // Go to the next std::vector<int>
i, // Make sure the next inner loop starts at the right index
intermedite+subData[i] // Take the intermidiate sum
);
}
}
// Wrapper to hide itermediate calculation variables
int functionWrapper(const std::vector<std::vector<int>> &data) {
int sum = 0;
function(sum, data, 0, 0, 0);
return sum;
}
答案 1 :(得分:0)
如果您只是想计算总和,那么它就像
一样简单for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
sum += x[i] + x[j];
}
}
相当于
for (int i = 0; i < n; i++) {
sum += (n - i) * x[i];
for (int j = i; j < n; j++) {
sum += x[j];
}
}
并付出更多努力
sum += (n + 1) * std::accumulate(std::begin(x), std::end(x), 0);
和3
const int sumx = std::accumulate(std::begin(x), std::end(x), 0);
sum += ((n + 1) * (n + 2) / 2) * sumx;