Hallo,
alternativ ein rekursiver Ansatz:
''' <summary>
''' Ruft für jede Permutation der Elemente aus arr den angegebenen Delegat
''' auf.
''' </summary>
''' <typeparam name="T">der Typ des Arrays</typeparam>
''' <param name="arr">das Array</param>
''' <param name="act">Ein Delegat vom Typ Action(Of T()), der für
''' jede Permutation aufgerufen werden soll</param>
''' <remarks></remarks>
Public Shared Sub ForEachPermutation(Of T)(arr As T(), _
act As Action(Of T()))
Dim newArray As T() = New T(arr.Length - 1) {}
Dim indexes As Integer() = New Integer(arr.Length - 1) {}
Dim taken As Boolean() = New Boolean(arr.Length - 1) {}
ForEachPermutationRek(arr, act, indexes, taken, 0, newArray)
End Sub
Private Shared Sub ForEachPermutationRek(Of T)(arr As T(), act As Action(Of _
T()), indexes As Integer(), taken As Boolean(), pos As Integer, newArray _
As T())
For i As Integer = 0 To arr.Length - 1
' Schauen, ob die POsition belegt is
If Not taken(i) Then
taken(i) = True
indexes(pos) = i
If pos < arr.Length - 1 Then 'rekursiv aufrufen
ForEachPermutationRek(arr, act, indexes, taken, pos + 1, _
newArray)
Else
'neues Array füllen und die Action aufrufen
For j As Integer = 0 To arr.Length - 1
newArray(j) = arr(indexes(j))
Next
act.Invoke(newArray)
End If
taken(i) = False
End If
Next
End Sub Der Funktion ForEachPermutation kann dann ein Array vom Typ T übergeben werden, sowie ein Action(Of T()), das für jede Permutation aufgerufen wird und ein Array mit den neuen Elementen enthält. Ein Aufruf
Dim arr As Integer() = {1, 2, 3}
Dim ausgabeNr As Integer = 0
ForEachPermutation(arr, _
Sub(array As Integer())
ausgabeNr += 1
Debug.WriteLine("Permutation " & ausgabeNr & ": " & String.Join( _
",", array))
End Sub) erzeugt dann z.B. die Ausgabe:
Permutation 1: 1,2,3
Permutation 2: 1,3,2
Permutation 3: 2,1,3
Permutation 4: 2,3,1
Permutation 5: 3,1,2
Permutation 6: 3,2,1 Auch hier müsste man dann z.B. unterschiedliche Actions angeben, die jeweils für das andere Array die Funktion aufrufen oder so. 
Beitrag wurde zuletzt am 13.02.12 um 21:54:13 editiert. |