Распечатать все комбинации для числового массива в Java - PullRequest
1 голос
/ 06 ноября 2011

У меня есть массив int [10]. каждый слот массива должен находиться в диапазоне [0,30], и я хотел бы сгенерировать все комбинации. Как мне это сделать? Это может быть легко, но я немного застрял кстати я использовал:

int[] array=new int[10];
for (int i=0;i<array.length;i++){
    for (int j=0;i<30;j++){
        print(array);
    }
}

, но не печатает все комбинации.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2011

Вот алгоритм, описанный Кеннетом Х. Розеном, Дискретная математика и ее приложения, 2-е издание (NY: McGraw-Hill, 1991), с. 284-286: CombinationGenerator - Java (ссылка обновлена)

Наслаждайтесь,

0 голосов
/ 06 ноября 2011

вам нужно добавить элементы в этот массив. первый цикл дает вам внутренний доступ к переменной i, второй для j, но для ее заполнения я бы сначала предпочел рекурсивный способ:

создайте метод с переменными для вашего массива и индексом (какое место нужно заполнить следующим в массиве). Затем вызовите метод с новым массивом и индексом = 0

в методе 1. проверьте, находится ли индекс уже вне диапазона массива. в этом случае выведите массив и выйдите из метода 2. во всех остальных случаях добавьте цикл for от 0 до 30, а внутри добавьте текущий номер в местоположение 'index' и снова вызовите метод, предоставив свой массив и индекс + 1

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

Вот пример на языке vb.net. Вы не можете напрямую скопировать и вставить, но это может помочь понять, как создавать комбинации.

Private Sub AllCombinations(array() As Integer, index As Integer)
  If index < 10 Then
    For i As Integer = 0 To 30
      array(index) = i
      AllCombinations(array, index + 1)
    Next
  Else
    PrintMethod(array.ToString)
  End If
End Sub

Private Sub AllPermutations(array() As Integer, index As Integer, remaining As List(Of Integer))
  If index < 10 Then
    For Each ele In remaining
      array(index) = ele
      Dim newRemaining As New List(Of Integer)
      newRemaining.AddRange(remaining)
      newRemaining.Remove(ele)
      AllPermutations(array, index + 1, newRemaining)
    Next
  Else
    PrintMethod(array.ToString)
  End If
End Sub

индекс 0..9 - это массив, если индекс равен 10, то массив заполнен, и мы его только покажем. Либо мы заполняем каждый слот любым числом от 0 до 30, либо вы сохраняете список, чтобы запомнить, какие номера еще остались (в перестановках сначала нужно заполнить оставшийся список всеми разрешенными числами!)

...