所以对于微积分课上的这个额外的学分问题,我和我的其他书呆子同学决定,我们将建立一个程序来强行解决其中一个步骤涉及排列。通过这个算法,我成功地让它工作(我想):
public void genPermutations(int[] list, int k){
System.out.println("List: " + Arrays.toString(list));
System.out.println("----------------------");
if(k > list.length){
System.out.println("Not enough elements!");
return;
}
int[] counts = new int[list.length];
for(int i = 0; i < counts.length; i++){
counts[i] = 1;
}
int[] data = new int[k];
permutationHelper(list, counts, data, 0, k);
}
public void permutationHelper(int[] list, int[] counts, int[] data, int index, int k){
if(index == k){
//System.out.println(Arrays.toString(data));
permutations.add(data);
}else{
for(int i = 0; i < list.length; i++){
if(counts[i] == 0){
continue;
}
data[index] = list[i];
counts[i]--;
permutationHelper(list, counts, data, index + 1, k);
counts[i]++;
}
}
}
我有一个
ArrayList
存储所有可能的排列(作为整数数组),这些排列可以由我传递给函数的列表中的k个元素构成问题是,如果我在函数之外打印所有这些置换,比如在调用genPermutations
函数之后,现在每个置换都是相同的但是,当我打印出注释在permutationHelper
函数中的数据时,它正确地列出了所有可能的排列;我只是以后无法在程序中访问它们。我的问题是当我退出函数时,为什么值会改变?任何帮助都将不胜感激。以下是一些图片:
What is printed where the comment is.
What is printed later in the program.
用于打印函数外部所有内容的代码是:
for(int i = 0; i < permutations.size(); i++){
System.out.println(Arrays.toString(permutations.get(i)));
}
我真的不知道是否有必要知道,但我只是想把它包括进来以防万一提前谢谢。
最佳答案
这里的问题是,在将array
添加到list
之后,您正在一次又一次地在不同的迭代中修改同一个对象你在[3,2,1]
中得到list
是因为那是上次迭代的结果因此,作为修复,您可以使用以下代码它所做的是创建data
数组的副本并将其添加到列表中。
int[] temp = Arrays.copyOf(data, data.length);
permutations.add(temp);
或者可以使用
clone()
from array,如下所示。int[] temp = data.clone();
permutations.add(temp);