XL 2016 VBA : transformer algorithme récursif en algorithme itératif.

dionys0s

XLDnaute Impliqué
Bonjour le forum,

j'avais écrit il y a quelques mois une fonction servant à "aplatir" un ParamArray pouvant être rempli par des valeurs et/ou des arrays, chaque array étant potentiellement également composé de valeurs et/ou d'arrays.

VB:
Public Sub TestAplatir()

  Dim Str1 As String, Str2 As String

  'Exemple sans array
  Let Str1 = VBA.Join(Aplatir( _
    1, _
    2, _
    3, _
    4, _
    5, _
    6, _
    7, _
    8, _
    9, _
    10), ", ") 'Renvoie "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"

  'Exemple avec des valeurs et des arrays imbriqués
  Let Str2 = VBA.Join(Aplatir( _
    1, _
    Array( _
      2, _
      3), _
    Array( _
      4, _
      Array( _
        5, _
        6, _
        7), _
      8, _
      9), _
    10), ", ") 'Renvoie "1, 2, 3, 4, 5, 6, 7, 8, 9, 10" également

  VBA.MsgBox Str1 & VBA.vbNewLine & Str2

End Sub

Public Function Aplatir(ParamArray Elements() As Variant) As Variant()

  Dim vntElement As Variant

  Let Aplatir = VBA.Array

  For Each vntElement In Elements
    Call sAplatir(Aplatir, vntElement)
  Next vntElement

End Function

Private Sub sAplatir(ByRef Result() As Variant, ByRef Element As Variant)

  Dim vntElement As Variant

  If VBA.IsArray(Element) Then
    For Each vntElement In Element
      Call sAplatir(Result, vntElement)
    Next vntElement
  Else
    ReDim Preserve Result(LBound(Result) To UBound(Result) + 1)
    Let Result(UBound(Result)) = Element
  End If

End Sub

Ma question est la suivante : existe-t-il une approche non récursive (itérative donc) pour arriver au même résultat à partir des même paramètres ? J'étais persuadé d'avoir trouvé par le passé des pages Internet à ce sujet, mais impossible de les retrouver.

D'avance, merci pour votre aide

dionys0s
 

Pièces jointes

  • Flat ParamArray.xlsm
    20.7 KB · Affichages: 3

ThomasR

XLDnaute Occasionnel
Bonjour,

Je pense avec une sub main qui commencerait par faire une boucle sur le premier array
à l’intérieur de celle-ci utilisation de variable variant dans une boucle do until qui appel une fonction qui parcours un array et qui ne s'arrête que si ce n'est pas un array
du redim dans tous les sens, et pour que ce soit plus simple des goto pour recommencer

bref un truc moche et verbeux

pourquoi vouloir faire autrement, car le sujet que tu souhaites traiter est parfait en récursif, le faire comme tu le demande reviendrai à coder comme un débutant qui ne saurait pas faire d’algorithmie.

Je suis curieux de savoir. (tu dois le faire en assembleur c'est pour ça ;-) )

Cordialement,
Thomas
 

Discussions similaires

Réponses
17
Affichages
828

Statistiques des forums

Discussions
312 199
Messages
2 086 159
Membres
103 145
dernier inscrit
lea.