AW: Alle Permutationen auflisten (aaaabbccc}
04.06.2023 01:01:39
Konrad
Hallo
habe nun selbst eine Lösung gefunden:
Sub Aufruf_Permutation_Beispiel1()
Call Ergebnisausdruck(PermutationenMitWiederholung(Array(1, 2, 3, 4)))
End Sub
Sub Aufruf_Permutation_Beispiel2()
Call Ergebnisausdruck(PermutationenMitWiederholung(Array(1, 1, 1, 0, 0)))
End Sub
Sub Aufruf_Permutation_Beispiel3()
Dim aListe()
Dim cPermutationen As Collection
aListe = Array("rot", "rot", "blau", "blau", "blau", "gelb", "gelb", "gelb")
Set cPermutationen = PermutationenMitWiederholung(aListe)
Ergebnisausdruck cPermutationen
End Sub
Sub Ergebnisausdruck(Sammlung As Collection)
'Die Einträge einer Collection werden im Direktbereich ausgedruckt.
Dim i As Long
For i = 1 To Sammlung.Count
Debug.Print i, Join(Sammlung(i), ", ")
If i > 100 Then
Debug.Print i, "..."
Exit For
End If
Next i
Debug.Print Sammlung.Count & " Permutationen"
End Sub
Function PermutationenMitWiederholung(Grundmenge) As Collection
'Alle Permutationen der Einträge von Grundmenge werden in einer Collection zurückgegeben.
Dim Sammlung As New Collection
Call TeilPerm(Grundmenge, Sammlung, 0)
Set PermutationenMitWiederholung = Sammlung
End Function
Sub TeilPerm(ByVal Liste, Sammlung As Collection, StartNr As Long)
Dim Nummer As Long
For Nummer = StartNr To UBound(Liste)
If Nummer > StartNr Then Liste = Tausch(Liste, StartNr, Nummer)
If StartNr + 1 UBound(Liste) Then
Call TeilPerm(Liste, Sammlung, StartNr + 1)
Else
On Error Resume Next
Sammlung.Add Liste, Join(Liste, ", ")
On Error GoTo 0
End If
Next Nummer
End Sub
Function Tausch(ByVal Liste, PosA, PosB)
'Zwei Einträge eines Arrays werden getauscht
Dim Zwischen
Zwischen = Liste(PosA)
Liste(PosA) = Liste(PosB)
Liste(PosB) = Zwischen
Tausch = Liste
End Function
Ist vielleicht nicht optimal, aber für mich reicht es. Verbesserungsvorschläge gerne willkommen.
LG, Konradw