2

我遇到了试图从集合[1..N]中生成K元素的所有变体的问题。我也有一个想法,我可以用 k 个嵌套循环来做到这一点,并尝试递归地做到这一点,但没有成功。


我有这个功能:

public static void PrintVariation(int n, int k, int[] array) 
{ 
   //when k = 2 

   for (int i = 0; i < n; i++) 
   { 
      for (int j = 0; j < n; j++) 
      { 
         Console.WriteLine("{0}, {1}", array[i], array[j]); 
      } 
   } 
} 

k但是当有一个随机值时我想做什么?

4

3 回答 3

0

这是我的提示:我认为您使用递归走在正确的轨道上。

private List<Element[]> getVariations(int k, Element[] elements)
{
    // ... ^_^
    // use getVariations with less elements in here
}
于 2012-01-03T14:34:04.880 回答
0

我不确定我是否跟随你,但这是我认为你应该做的:

  1. 创建一个函数,它将“从集合 [1..N] 中生成 K 个元素的变体”它应该返回该变体。
  2. 在另一个方法中的 for 循环中调用该函数,将其添加到通用集合中。您可以添加另一个例程来检查该函数生成的变体是否已存在于集合中,并跳过将该变体添加到集合中。
于 2012-01-03T14:49:28.627 回答
-1
public static List<List<T>> GetVariations<T>(int k, List<T> elements)
{
    List<List<T>> result = new List<List<T>>();
    if (k == 1)
    {
        result.AddRange(elements.Select(element => new List<T>() { element }));
    }
    else
    {
        foreach (T element in elements)
        {
            List<T> subelements = elements.Where(e => !e.Equals(element)).ToList();
            List<List<T>> subvariations = GetVariations(k - 1, subelements);
            foreach (List<T> subvariation in subvariations)
            {
                subvariation.Add(element);
                result.Add(subvariation);
            }
        }
     }
     return result;
 }
于 2012-01-03T15:21:10.320 回答