如何递归向vector中添加元素?我的组合数生成代码问题求助
代码存在的问题分析
- 递归结果未合并:每次递归调用
generateVector(x, y)都会生成新的std::vector,但你没有将递归返回的vector元素合并到当前函数的v中。比如初始调用generateVector(4,4)时,只会把4C4加入v,后续递归生成的4C3、4C2等元素都会被丢弃,最终返回的vector只有第一个元素。 - 函数调用不符合需求:你要存储的是组合数(nCk),但代码中调用的是
permutation(x, y),如果这个函数用于计算排列数(nPk),那结果完全不符合预期,需要替换为组合数计算函数。 - 递归冗余开销:每次递归都新建vector并进行拷贝操作,会造成不必要的性能损耗,这属于功能实现后的优化点。
修复后的示例代码
std::vector<int> generateVector(int x, int y){ std::vector<int> v; if(y < 0){ return v; } // 调用组合数计算函数替换排列数函数 v.push_back(combination(x, y)); --y; // 将递归返回的子vector元素合并到当前vector auto subVec = generateVector(x, y); v.insert(v.end(), subVec.begin(), subVec.end()); return v; } // 组合数计算函数实现示例 int combination(int n, int k) { if(k == 0 || k == n) return 1; k = std::min(k, n - k); // 利用组合数对称性减少计算量 int result = 1; for(int i = 1; i <= k; ++i){ result = result * (n - k + i) / i; } return result; }
内容的提问来源于stack exchange,提问作者jcfan91
相关产品推荐
相关产品推荐

