2012-01-03 5 views
2

Я застрял в этой задаче, пытаясь генерировать все вариации элементов K из набора [1..N]. У меня также была идея, что я могу сделать это с помощью k чисел вложенных циклов и попытался сделать это рекурсивно, но без успеха.Найти все варианты элементов K из набора n


У меня есть эта функция:

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 имеет случайное значение?

+2

Пожалуйста, ваши текущий код и объяснить, где у вас возникли трудности с ним. – Oded

+0

Можете ли вы поместить код, который у вас есть, чтобы мы могли лучше понять вопрос, пожалуйста. –

+0

- это домашнее задание? – rene

ответ

0

Вот мой намек: я думаю, что вы на правильном пути, используя рекурсию.

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

Хмм, подсказка с большим количеством '[]', в то время как у нас есть эти удобные '<>' –

+0

'<>' это тогда. Это всего лишь намек. ^^ – JOG

0

Я не уверен, что я следую за вами, хотя, но это то, что я думаю, что вы должны сделать:

  1. Создать функцию, которая будет «генерировать изменение K элементов из множества [1 ..N] 'Он должен вернуть эту вариацию.
  2. Вызовите эту функцию в цикле for в другом методе, который добавит его в общую коллекцию. Вы можете добавить еще одну процедуру, которая будет проверять, существует ли вариация, сгенерированная функцией, в коллекции, и пропустить добавление этой вариации в коллекцию.
+0

я иметь эту функцию: государственной статической силы PrintVariation (Int N, Int к, INT [] массив) {// , когда к = 2 для (INT I = 0; <п; я ++) { для (Int J = 0, J user1127964

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