簡體   English   中英

從一組n中找出K個元素的所有變體

[英]Find all the variations of K elements from a set of n

我陷入了嘗試從集合[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具有隨機值時我應該怎么做?

這是我的提示:我認為您使用遞歸的方法正確。

private List<Element[]> getVariations(int k, Element[] elements)
{
    // ... ^_^
    // use getVariations with less elements in here
}

我不確定我是否會跟着你,但這是我認為你應該做的:

  1. 創建一個將“從集合[1..N]中生成K個元素的變體”的函數,該函數應返回該變體。
  2. 在另一個將其添加到通用集合的方法中的for循環中調用該函數。 您可以添加另一個例程,該例程將檢查由函數生成的變體是否已經存在於集合中,並跳過將該變體添加到集合中。
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;
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM