Java - 值在递归调用后未反映

Java - Values aren't reflecting after recursion call

我 运行 在获取名为 res 的 List<List<Integer>> 的价值时遇到了问题。这是一个递归调用,该调用应该填充此“res”,但是当另一个函数调用递归函数并且该函数返回一个空列表时。但是当我记录它时,我可以看到这些值。这是代码:

class Solution {
    public List<List<Integer>> combinationSum(int[] arr, int k) {
        // given an arr and a sum k, find all the subsequences that sum upto k
            // we can use backtracking here as we need all the options
            // there are 2 choices for every element:
            // either we can take it in the subres or discard it
            // if we take it once, we can take it n times till the target is reached
            
            Arrays.sort(arr);
            List<List<Integer>> res = new ArrayList<>();
            List<Integer> subRes = new ArrayList<>();

            combinationSum(0, arr, k, 0, res, subRes);

            return res;
    }
  
    public void combinationSum(int i, int[] arr, int k, int sum,
                                              List<List<Integer>> res, 
                                              List<Integer> subRes){
          if(sum == k) {
            if(!res.contains(subRes)) res.add(subRes);
            System.out.println("res = " + res);
            return;
          }

          if(i == arr.length || sum > k) return;

          subRes.add(arr[i]);
          sum += arr[i];
      
          combinationSum(i, arr, k, sum, res, subRes);

          subRes.remove(new Integer(arr[i]));
          sum -= arr[i];

          combinationSum(i + 1, arr, k, sum, res, subRes);
      
        }
}

我对此深陷其中, 提前致谢。

您在递归中对 subRes 所做的更改会影响您在 res 中看到的内容。在将 subRes 添加到 res 之前,制作一个 新副本

 if(!res.contains(subRes)) {
     res.add(new ArrayList<>(subRes));
}

在您的代码中,正确的列表 (subRes) 被添加到 res,但是您 mutate/modify subRes 稍后在递归调用 returns.