置换中递归的行为不一致

时间:2017-02-19 07:19:54

标签: c# recursion

我有一个使用堆排列算法对数组进行排列的类,但是当我打印出所有排列时,我得到所有正确的排列,将项添加到列表然后打印列表,我得到相同的项重复。这是我的代码

using System;
using System.Collections.Generic;
 namespace HeapsPermutation
{
  class Program
    {
    static void Main(string[] args)
    {
        string[] numbers = new string[4];
        numbers[0] = "a";
        numbers[1] = "b";
        numbers[2] = "c";
        numbers[3] = "d";

        Permutation<string>.permutate(numbers.Length, numbers);

        Console.Read();

    }

}

class Permutation<T>
{
   static List<T[]>  permutated_items = new List<T[]>();
    public static void permutate(int n, params T[] array)
    {

        if (n == 1)
        {
            foreach (T x in array)
            {
                Console.Write(x); // gives correct result
            }
            Console.WriteLine(); 
            permutated_items.Add(array); // does no add correct result
        }

        else
        {
            for (int i = 0; i < n - 1; i++)
            {
                permutate(n - 1, array);
                if (n % 2 == 0)
                {
                    swap(ref array[i], ref array[n - 1]);
                }
                else
                {
                    swap(ref array[0], ref array[n - 1]);
                }
            }
            permutate(n - 1, array);
        }
    }

    private static void swap(ref T x, ref T y)
    {
        T temp = x;
        x = y;
        y = temp;
    }
}

}

1 个答案:

答案 0 :(得分:2)

数组是引用类型!因此,您可以在同一个对象上操作,更改所有项目。在将数组添加到列表之前克隆该数组。

permutated_items.Add((T[])array.Clone());