所以对于微积分课上的这个额外的学分问题,我和我的其他书呆子同学决定,我们将建立一个程序来强行解决其中一个步骤涉及排列。通过这个算法,我成功地让它工作(我想):

    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);

07-28 02:49
查看更多