Java (ArrayList) 中的递归函数失败

Recursive function fails in Java (ArrayList)

 static List<List<Integer>> finalSubset = new ArrayList<>();

 public static void main(String[] args) {
                ArrayList<Integer> a = new ArrayList<>();
                Integer[] array = {1, 2 ,3};
                Collections.addAll(a, array);
                subsets(a, 0);
                System.out.println(finalSubset);
    
            }
static void subsets (ArrayList<Integer> arr, int pos) {
        if (arr.size() == 0) return;
        finalSubset.add(arr); //problem
        for (int i = pos; i < arr.size(); i++) {
            Integer temp = arr.get(i);
            arr.remove (i);
            subsets(arr, i);
            arr.add(i, temp);
        }
    }

我尝试编写一个代码,使用 ArrayList 打印出给定数组的所有可能子集,当我 运行 时输出是正确的,但是当我用 [= 替换 System.out.println(arr) 时13=] 输出是:

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

需要时:

[1, 2, 3], [2, 3], [3], [2], [1, 3], [1], [1, 2], []

这样输出的原因是什么?

您多次将相同的数组列表添加到 finalSubset。你应该在每次递归时创建一个副本,或者当你添加到 finalSubset:

finalSubset.add(new ArrayList<>(arr));

或者当你进行递归调用时:

subsets(new ArrayList<>(arr), i);

这样你就有了不同的列表,里面可以有不同的东西。如果你只有一个列表,你只会得到同样的东西重复 8 次。

此外,您应该在return之前添加到finalSubset,否则空列表将不会添加到finalSubset

finalSubset.add(new ArrayList<>(arr));
if (arr.size() == 0) return;