Permutation d'elements

Bonsoir

j'ai realisé le bout de code suivant permettant de calculer toutes les permutations possibles de caracteres présentés dans un tableau de type array que voici :

Option Base 1
Sub permutations()
t = Array("A", "B", "C", "D", "E", "F")   ' c'est la chaine choisie mais on peut ajouter des caracteres
For c = 1 To UBound(t)
 debut = debut & c
 fin = fin & UBound(t) - x
 x = x + 1
Next

For i = Val(debut) To Val(fin)
n = 0

  For k = 1 To Len(i)
   If InStr(i, k) > 0 Then
     n = n + 1
   End If
  Next
  If n = Len(i) Then

      ch = ""
       For j = 1 To Len(i)
        ch = ch & t(Val(Mid(i, j, 1)))
       Next
          Cells(65000, 1).End(xlUp).Offset(1, 0) = ch  ' renvoi les resultats dans la colonne 1 de ma feuille de calcul 
   End If

Next
End Sub

Le code tourne mais est il suffisamment bien présenté ? Merci .

Salut rocket4,

AStucieux!

La présentation est affaire personnelle : il est des codes efficaces que je ne comprends qu'après les avoir moulinés à ma sauce!

Sauce Curulis : celle que je préfère!

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
t = Array("A", "B", "C", "D", "E", "F")   ' c'est la chaine choisie mais on peut ajouter des caracteres
'
For c = 1 To UBound(t)
    debut = debut & c
    fin = fin & UBound(t) - (c - 1)
Next
For i = Val(debut) To Val(fin)
    n = 0
    For k = 1 To Len(i)
        If InStr(i, k) > 0 Then n = n + 1
    Next
    If n = Len(i) Then
        ch = ""
        For j = 1 To Len(i)
            ch = ch & t(Val(Mid(i, j, 1)))
        Next
        Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = ch  ' renvoi les resultats dans la colonne 1 de ma feuille de calcul
    End If
Next
'
End Sub

A+

Bonjour,

Avec une fonction récursive :

Sub Test()

    Dim Tbl()
    Dim T
    Dim I As Integer
    Dim J As Long
    Dim Chaine As String

    T = Array("A", "B", "C", "D", "E", "F")

    For I = 0 To UBound(T): Chaine = Chaine & T(I): Next I

    Permuter Chaine, "", Tbl, J
    Columns(1).Clear
    Range(Cells(1, 1), Cells(UBound(Tbl), 1)).Value = Application.Transpose(Tbl)

End Sub

Sub Permuter(Chaine As String, Debut As String, Tbl(), J As Long)

    Dim I As Integer

    If Len(Chaine) = 1 Then

         J = J + 1: ReDim Preserve Tbl(1 To J)
        Tbl(J) = Debut & Chaine

    Else

        For I = 1 To Len(Chaine)

            Permuter Mid(Chaine, 2, Len(Chaine) - 1), Debut & Left(Chaine, 1), Tbl, J
            Chaine = Mid(Chaine, 2, Len(Chaine) - 1) & Left(Chaine, 1)

        Next

    End If

End Sub

Merci à tous pour vos suggestions ! il y a effectivement plusieurs facons de faire

Il y a toujours plusieurs façons de faire, j'en ai montré une mais il faut savoir qu'une fonction récursive est consommatrice de mémoire car il faut stocker les résultats intermédiaires à chaque appel de la fonction. Une fonction récursive très connue, la factorielle d'un nombre, ici un petit exemple du fonctionnement, il te faut ouvrir la fenêtre d'exécution (Ctrl+G) et exécuter la sub "Test(')" avec F8 (en pas à pas) :

Sub test()

    MsgBox Factorielle(10)

End Sub

Function Factorielle(Nb As Integer)

    'déclarées en static pour garder en mémoire les valeurs
    Static Rappel As Integer
    Static Fin As Boolean

    Rappel = Rappel + 1: Debug.Print Rappel

    If Nb = 1 Then 'Point de sortie, absolument obligatoire pour éviter une boucle sans fin !

        Factorielle = 1
        Fin = True
        Debug.Print "Maintenant, phase de calcul !"

    Else

        'à chaque appel, le résultat est stoké en mémoire
        'ce qui crée unne pile des appels
        Factorielle = Nb * Factorielle(Nb - 1)

    End If

    'on remonte la pile des appels
    If Fin = True Then Rappel = Rappel - 1: Debug.Print Rappel

End Function
Rechercher des sujets similaires à "permutation elements"