Creer un arbre avec des lettres de l'alphabet

mamx Messages postés 9 Date d'inscription vendredi 3 mai 2002 Statut Membre Dernière intervention 20 novembre 2003 - 20 nov. 2003 à 17:58
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 21 nov. 2003 à 10:06
Bonjour,

Je suis bien embeter car mes cours de l'IUT sont loin et je ne me souviens plus comment créer un arbre.

Je m'explique :

Je possede une tableau Lettre(26) avec les lettre de l'alphabet.
A partir de ce tableau je voudrait construire cette liste :
A
AA
AAA
AAB
AAC
...
AB
ABA
...etc...

Et malgre tous mes efforts, l'utilisation de la recursivite je n'y arrive pas si quelqu'un peu me donner un coup de main.

Merci...

9 réponses

cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
20 nov. 2003 à 18:17
Au lieu d'utiliser un modèle recurssif, utilise plutôt un tri genre tri à bulle si c'est un tableau non??? C'est un classique du tri. Il y avait celui ci qui étaitdonné comme + performant, récupéré sur vbfrance
Public Sub TriParSelection(tabLong() As Long)
Dim lgFor As Long
Dim lgMem As Long, lgTiers As Long
Dim lgTmp As Long
lgTiers = LBound(tabLong)
Do
    lgTiers = 3 * lgTiers + 1
Loop Until lgTiers > UBound(tabLong)
Do
    lgTiers = lgTiers / 3
    For lgFor = lgTiers + LBound(tabLong) To UBound(tabLong)
' Enregistrement de la valeur de l'élément "courant"
        lgTmp = tabLong(lgFor)
        lgMem = lgFor
        Do While tabLong(lgMem - lgTiers) > lgTmp
' Ecrase la valeur de l'élément "courant" (ou de comparaison, à partir du second tour)
            tabLong(lgMem) = tabLong(lgMem - lgTiers)
' Recherche la position d'un nouvel élément de "comparaison"
            lgMem = lgMem - lgTiers
' Evite de sortir des limites du tableau
            If lgMem < lgTiers Then Exit Do
        Loop
' Enregistre la valeur de l'élément courant à la place de
' l'élément de comparaison si l'échange a effectivement eu lieu.
' Sinon, cela n'a aucun effet, enregistrement de l'élément courant
' sur lui-même
        tabLong(lgMem) = lgTmp
    Next lgFor
Loop Until lgTiers = LBound(tabLong)
End Sub  
0
mamx Messages postés 9 Date d'inscription vendredi 3 mai 2002 Statut Membre Dernière intervention 20 novembre 2003
20 nov. 2003 à 19:03
Ben en fait ce n'est pas vraiement un tri puisque dans mon tableau je n'ai qu'une fois les 26 lettres et ensuite a partir de ce tableau avoir la liste decrite plus haut.

lettre(1)=A ... lettre(26)=Z

A
AA
AAA
AAB
AAC
AAD
...
ZZX
ZZY
ZZZ

je saispas si c'est plus clair maintenant.
0
cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
20 nov. 2003 à 19:30
Mais combien de fois tu veux répéter ces pattens??? C'est un nombre finit non??? Parce que si c'est simplement sur 3 niveaux, tu fais 3 boucles imbriquées et voila
for i=0 to 26
Text1.text = text1.text & lettre(i) & vbCrLf
for j=0 to 26
Text1.text = text1.text & lettre(i) & lettre(j) & vbCrLf
for k=0 to 26
Text1.text = Text1.text &lettre(i) & lettre(j) & lettre(k) & vbCrLf
next k
next j
next i

Ca devrait faire ce que tu veux
0
mamx Messages postés 9 Date d'inscription vendredi 3 mai 2002 Statut Membre Dernière intervention 20 novembre 2003
20 nov. 2003 à 20:27
ben evidemment je voudrais bien que le nombre de niveaux soient dynamique ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
20 nov. 2003 à 20:39
Ben je sais pas pour ce soir, je vais me matter les bonus des 2 tours. Peut être demain, mas la recurrsivité, c pas mon truc : )).
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 nov. 2003 à 03:06
Si j'ai bien tout compris,

Function BuildTree(ByVal Levels As Byte, Optional ByVal Start As String = vbNullString) As String
    Static Buffer As String
    Static TmpBuffer As String
    Dim i As Byte, a As String * 1
    For i = 65 To 90
        a = Chr$(i)
        TmpBuffer = TmpBuffer & Start & a & vbCrLf
        If Levels > 0 Then
            BuildTree Levels - 1, Start & a
        ElseIf i = 90 Then
            Buffer = Buffer & TmpBuffer
            TmpBuffer = vbNullString
        End If
    Next i
    BuildTree = Buffer
End Function

Private Sub Form_Load()
    Text1.Text = BuildTree(2)
End Sub


et voila....

au passage, radada, ton code est a optimiser par l'utilisation de variables intermediaires
Dim i As Byte, j As Byte, k As Byte
    
    Dim a As String, b As String
    Dim Buffer As String, TmpBuffer As String
    For i = 65 To 90
        a = Chr$(i)
        TmpBuffer = TmpBuffer & a & vbCrLf
        For j = 65 To 90
            b = a & Chr$(j)
            TmpBuffer = TmpBuffer & b & vbCrLf
            For k = 65 To 90
                TmpBuffer = TmpBuffer & b & Chr$(k) & vbCrLf
            Next k
        Next j
        Buffer = Buffer & TmpBuffer
        TmpBuffer = vbNullString
        DoEvents
    Next i
    Text1.Text = Buffer

je passe de 16 a 0.1 secondes....

il ne faut jamais faire de concatenation massive ave Text1.text, les temps d'accès sont trop longs !!

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
21 nov. 2003 à 08:07
OK Renfield, merci du conseil, je ne savais pas. Cest ce genre de truc qui m'aide à progresser ; ). Merci bcp m'sieur
0
cs_radada Messages postés 488 Date d'inscription lundi 15 septembre 2003 Statut Membre Dernière intervention 21 avril 2009 1
21 nov. 2003 à 08:08
Dis moi au fait Renfield, ou est-ce que tu teste tes temps d'exécution comme ça, parce que cela me serait bien utile :D:D:D. Merci encore
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 nov. 2003 à 10:06
On peut utiliser une methode précise avec les API, mais pour ce faire une idée, il suffit de faire :

Dim Start as Long
Start = Timer

'# CODE DONT LE TEMPS EST A TESTER

MsgBox "Temps : " & ( timer - start ) & "s"


j'ai utilisé ton code en fait, pour pouvoir l'arbre a generer, car je me posait certaines question.
son temps d'execution prohibitif m'a fait l'optimiser.....
le fait d'utiliser Text1.text, fait que ce controle est redessiné, et qu'un certain nombre de choses sont recalculées.... c'est long !!

de même j'ai utilisé un Buffer intermédiraire, car c'etat encore trop long, en concatenant toujours dans le meme buffer. en effet, VB dois calculer sans cesse la taile du Buffer, allouer un espace suffisament grand, et tranferer le contenu.....

au fait, est-ce bien et arbre que tu souhaitait generer ?? il s'agit simplement de la liste de toutes les combinaisons possibles

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
Rejoignez-nous