Просто нашел один способ сделать это рекурсивно и избегать двойных результатов. Код довольно уродливый, потому что у меня не было времени подумать, как использовать циклы здесь.
Public Function Permutacao (card1 As String, Card2 As String, card3 As String, card4 As String, card5 As String, Optional card6 As String, Optional card7 As String)
Dim A(1 To 7) As String
Dim aux_A(1 To 7, 1 To 6) As String
Dim aux2_A(1 To 6, 1 To 5) As String
Dim final_A(1 To 42, 1 To 6) As String
n = 5
A(1) = card1
A(2) = card2
A(3) = card3
A(4) = card4
A(5) = card5
If Not IsMissing(card6) Then
A(6) = card6
n = 6
End If
If Not IsMissing(card7) Then
A(7) = card7
n = 7
End If
If n = 5 Then
final_A(1, 1) = A(1)
final_A(1, 2) = A(2)
final_A(1, 3) = A(3)
final_A(1, 4) = A(4)
final_A(1, 5) = A(5)
ElseIf n = 6 Then
k = 1
final_A(k, 1) = A(1)
final_A(k, 2) = A(2)
final_A(k, 3) = A(3)
final_A(k, 4) = A(4)
final_A(k, 5) = A(5)
k = 2
final_A(k, 1) = A(1)
final_A(k, 2) = A(2)
final_A(k, 3) = A(3)
final_A(k, 4) = A(4)
final_A(k, 5) = A(6)
k = 3
final_A(k, 1) = A(1)
final_A(k, 2) = A(2)
final_A(k, 3) = A(3)
final_A(k, 4) = A(6)
final_A(k, 5) = A(5)
k = 4
final_A(k, 1) = A(1)
final_A(k, 2) = A(2)
final_A(k, 3) = A(6)
final_A(k, 4) = A(4)
final_A(k, 5) = A(5)
k = 5
final_A(k, 1) = A(1)
final_A(k, 2) = A(6)
final_A(k, 3) = A(3)
final_A(k, 4) = A(4)
final_A(k, 5) = A(5)
k = 6
final_A(k, 1) = A(6)
final_A(k, 2) = A(2)
final_A(k, 3) = A(3)
final_A(k, 4) = A(4)
final_A(k, 5) = A(5)
ElseIf n = 7 Then
k = 1
aux_A(k, 1) = A(1)
aux_A(k, 2) = A(2)
aux_A(k, 3) = A(3)
aux_A(k, 4) = A(4)
aux_A(k, 5) = A(5)
aux_A(k, 6) = A(6)
k = 2
aux_A(k, 1) = A(1)
aux_A(k, 2) = A(2)
aux_A(k, 3) = A(3)
aux_A(k, 4) = A(4)
aux_A(k, 5) = A(5)
aux_A(k, 6) = A(7)
k = 3
aux_A(k, 1) = A(1)
aux_A(k, 2) = A(2)
aux_A(k, 3) = A(3)
aux_A(k, 4) = A(4)
aux_A(k, 5) = A(7)
aux_A(k, 6) = A(6)
k = 4
aux_A(k, 1) = A(1)
aux_A(k, 2) = A(2)
aux_A(k, 3) = A(3)
aux_A(k, 4) = A(7)
aux_A(k, 5) = A(5)
aux_A(k, 6) = A(6)
k = 5
aux_A(k, 1) = A(1)
aux_A(k, 2) = A(2)
aux_A(k, 3) = A(7)
aux_A(k, 4) = A(4)
aux_A(k, 5) = A(5)
aux_A(k, 6) = A(6)
k = 6
aux_A(k, 1) = A(1)
aux_A(k, 2) = A(7)
aux_A(k, 3) = A(3)
aux_A(k, 4) = A(4)
aux_A(k, 5) = A(5)
aux_A(k, 6) = A(6)
k = 7
aux_A(k, 1) = A(7)
aux_A(k, 2) = A(2)
aux_A(k, 3) = A(3)
aux_A(k, 4) = A(4)
aux_A(k, 5) = A(5)
aux_A(k, 6) = A(6)
c = 1
k = 1
While k <= 7
If k < 2 Then
final_A(c, 1) = aux_A(k, 1)
final_A(c, 2) = aux_A(k, 2)
final_A(c, 3) = aux_A(k, 3)
final_A(c, 4) = aux_A(k, 4)
final_A(c, 5) = aux_A(k, 5)
c = c + 1
End If
If k < 3 Then
final_A(c, 1) = aux_A(k, 1)
final_A(c, 2) = aux_A(k, 2)
final_A(c, 3) = aux_A(k, 3)
final_A(c, 4) = aux_A(k, 4)
final_A(c, 5) = aux_A(k, 6)
c = c + 1
End If
If k < 4 Then
final_A(c, 1) = aux_A(k, 1)
final_A(c, 2) = aux_A(k, 2)
final_A(c, 3) = aux_A(k, 3)
final_A(c, 4) = aux_A(k, 6)
final_A(c, 5) = aux_A(k, 5)
c = c + 1
End If
If k < 5 Then
final_A(c, 1) = aux_A(k, 1)
final_A(c, 2) = aux_A(k, 2)
final_A(c, 3) = aux_A(k, 6)
final_A(c, 4) = aux_A(k, 4)
final_A(c, 5) = aux_A(k, 5)
c = c + 1
End If
If k < 6 Then
final_A(c, 1) = aux_A(k, 1)
final_A(c, 2) = aux_A(k, 6)
final_A(c, 3) = aux_A(k, 3)
final_A(c, 4) = aux_A(k, 4)
final_A(c, 5) = aux_A(k, 5)
c = c + 1
End If
If k < 7 Then
final_A(c, 1) = aux_A(k, 6)
final_A(c, 2) = aux_A(k, 2)
final_A(c, 3) = aux_A(k, 3)
final_A(c, 4) = aux_A(k, 4)
final_A(c, 5) = aux_A(k, 5)
c = c + 1
End If
k = k + 1
Wend
End If
Permutacao = final_A
End Function
Попробуйте найти «перестановки» на [codereview.se] для работы с примерами на многих языках (не уверен, что я видел его в VBA, но, как только вы получите свой код для работы по назначению, я рекомендую вам его просмотреть там) –
Вам действительно нужны все комбинации? Для чего вы собираетесь их использовать? –
Это то, как я нашел, чтобы найти лучшую руку в игре в покер-техасский покер. У реки есть 7 карт, и ваша последняя рука - лучшая комбинация с 5 картами. –