gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:00:27 24 4
gpt4 key购买 nike

 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) 通过 funalSubset.add(arr) 输出是:

[[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 次相同的内容。

另外,在返回之前,你应该添加到finalSubset,否则空列表不会被添加到finalSubset

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

关于java - Java 中的递归函数失败(ArrayList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67020555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com