You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:57:19