C++递归求子序列和:结果vector为空,寻求解决方法
问题分析与修复
你的代码返回空vector的原因是函数参数传递方式错误:递归函数f中的vector<int> g采用值传递,每次调用f都会创建一个g的副本,递归中执行push_back操作时修改的只是这个副本,而非subsetSums函数里定义的原vector。递归结束后原vector未被修改,自然返回空。
修复方案
将递归函数中的vector<int> g改为引用传递(vector<int>& g),这样所有递归调用都会直接操作原vector,而非副本。修改后的代码如下:
class Solution { public: // 将g改为引用传递 void f(vector<int> arr, int N, int i, int sum, vector<int>& g){ if (i >= N){ g.push_back(sum); return; } // 选择包含当前元素 f(arr, N, i+1, sum + arr[i], g); // 选择不包含当前元素 f(arr, N, i+1, sum, g); } vector<int> subsetSums(vector<int> arr, int N) { vector<int> g; f(arr, N, 0, 0, g); return g; } };
额外优化建议
- 将数组
arr改为const vector<int>& arr引用传递,避免每次递归复制数组,提升执行效率。 - 简化代码逻辑,直接在递归调用时传递
sum + arr[i]和sum,去掉单独的sum加减操作,让代码更简洁。
优化后的版本:
class Solution { public: void f(const vector<int>& arr, int N, int i, int sum, vector<int>& g){ if (i >= N){ g.push_back(sum); return; } f(arr, N, i+1, sum + arr[i], g); f(arr, N, i+1, sum, g); } vector<int> subsetSums(vector<int> arr, int N) { vector<int> g; f(arr, N, 0, 0, g); return g; } };
修改后输入{2,3},返回的vector会包含0,2,3,5,配合主函数的排序操作即可得到期望输出。
内容的提问来源于stack exchange,提问作者gowtham_wick
相关产品推荐
相关产品推荐

