IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Lister toutes les combinaisons possibles avec permutation et répétition


Sujet :

VB.NET

  1. #1
    Candidat au titre de Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 27
    Points
    27
    Par défaut Lister toutes les combinaisons possibles avec permutation et répétition
    Bonjour

    j'ai longuement chercher sur ce forum et autre comment lister toutes les combinaisons possibles avec permutation et répétition seulement, je n'arrive pas à adapter les exemples que je trouve...

    En fait j'y arrive de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            For a As Integer = 0 To 9
                For b As Integer = 0 To 9
                    For c As Integer = 0 To 9
     
                        Debug.Print(a & ";" & b & ";" & c)
     
                    Next
                Next
            Next
    ce qui donne :

    0;0;0
    0;0;1
    0;0;2
    0;0;3
    0;0;4
    0;0;5
    0;0;6
    0;0;7
    0;0;8
    0;0;9
    0;1;0
    0;1;1
    0;1;2
    0;1;3
    0;1;4
    0;1;5
    0;1;6
    0;1;7
    0;1;8
    0;1;9
    0;2;0
    0;2;1
    0;2;2
    0;2;3
    0;2;4
    0;2;5
    0;2;6
    0;2;7
    0;2;8
    0;2;9
    0;3;0
    ...
    ...
    ...
    9;9;9


    Seulement ça fonctionne uniquement pour 3 boucles...
    je souhaiterai obtenir ce résultat mais avec un nombre de boucles variables...


    Soit avec 2 :
    0;0
    0;1
    0;2
    0;3
    0;4
    0;5
    0;6
    0;7
    0;8
    0;9
    1;0
    1;1
    1;2
    1;3
    ...
    9;9

    Soit avec 4 :
    0;0;0;0
    0;0;0;1
    0;0;0;2
    0;0;0;3
    0;0;0;4
    0;0;0;5
    0;0;0;6
    0;0;0;7
    0;0;0;8
    0;0;0;9
    0;0;1;0
    0;0;1;1
    0;0;1;2
    0;0;1;3
    0;0;1;4
    0;0;1;5
    0;0;1;6
    0;0;1;7
    ........
    9;9;9;9


    J'ai compris que je doit faire une fonction récursive mais j'arrive à rien...

    Merci de votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    à voir le résultat escompté, on peut dire qu'il s'agit d'une suite arithmétique de raison 1.
    Soit tous les nombres de 0 à 10 puissance le nombre de boucle -1.
    Si c'est à visualiser uniquement, ce type de bidouille pourrait peut être convenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private Sub Test2(nbreBoucle As Integer)
     
            For n As Integer = 0 To CInt(((10 ^ nbreBoucle) - 1))
                Dim str As String = n.ToString("D" & nbreBoucle)
                Dim s As String = ""
                For Each c As Char In str
                    s += c & ";"
                Next
                Debug.Print(s.Trim(";"c))
            Next
     
        End Sub
    ...

  3. #3
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Salut

    ci cela peut aider
    ici

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bonjour,

    Ma petite contribution (en partie pour le fun ), une méthode d'extension générique pour générer les permutations des éléments d'un ensemble passé en argument (donc pas forcément des entiers) sur une longueur donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Runtime.CompilerServices.Extension()>
    Function Permutations(Of TSource)(ByVal source As IEnumerable(Of TSource), ByVal length As Integer) As IEnumerable(Of IEnumerable(Of TSource))
        Return If(length = 0,
                  {Enumerable.Empty(Of TSource)},
                  source.SelectMany(Function(__) Permutation(source, length - 1),
                                    Function(item, perms) {item}.Concat(perms)))
    End Function
    Un exemple d'utilisation (utilise une méthode d'extension perso IEnumerable(Of T).ForEach jointe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Main()
        ' Utilisation du Select pour obtenir un affichage "utile"
        Enumerable.Range(0, 10).
            Permutations(4).
            Select(AddressOf String.Concat).
            ForEach(AddressOf Console.WriteLine)
    End Sub
     
    <Runtime.CompilerServices.Extension()>
    Sub ForEach(Of TSource)(ByVal source As IEnumerable(Of TSource), ByVal action As Action(Of TSource))
        For Each item In source
            action(item)
        Next
    End Sub
    Chez moi, ceci affiche les 10000 nombres en moins d'une seconde.

    Autre exemple pour montrer que cela fonctionne avec autre chose que des nombres (et une autre façon d'exploiter les résultats ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Main()
        Call {ConsoleColor.Red, ConsoleColor.Green, ConsoleColor.Blue}.
            Permutations(8).
            ForEach(Sub(perm)
                        Dim old = Console.BackgroundColor
                        perm.ForEach(Sub(color)
                                         Console.BackgroundColor = color
                                         Console.Write(" ")
                                     End Sub)
                        Console.BackgroundColor = old
                        Console.WriteLine()
                    End Sub)
    End Sub
    Affiche (à un moment)


    Cordialement !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    Candidat au titre de Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Merci à tous pour vos réponses.

    Je choisi la solution de Sehnsucht qui est particulièrement efficace.

    Sehnsucht, pourrais tu m'expliquer un peu dans le détail le fonctionnement de ces routines car je doit la modifier afin de sortir de la boucle avant sa fin si une certaine condition est remplie ?

    En fait pour chaque série obtenue, exemple 0015, si la condition est remplie, il faudrait sauter à la suivante, soit 0020, et donc sauter les 0016, 0017, 0018 et 0019...

    Merci

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    ci dessous une traduction VB de cette discussion ;
    (En application Windows, vs2012 pour "Yield")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
        Class arrangements
     
            Private Iterator Function Prepend(Of T)(first As T, rest As IEnumerable(Of T)) As IEnumerable(Of T)
                Yield first
                For Each item As T In rest
                    Yield item
                Next
            End Function
     
            Private Iterator Function M(p As Integer, t1 As Integer, t2 As Integer) As IEnumerable(Of IEnumerable(Of Integer))
                If p = 0 Then
                    Yield Enumerable.Empty(Of Integer)()
                Else
                    For first As Integer = t1 To t2
                        For Each rest As IEnumerable(Of Integer) In M(p - 1, first, t2)
                            Yield Prepend(first, rest)
                        Next
                    Next
                End If
            End Function
     
            Public Sub Main(p As Integer, T1 As Integer, T2 As Integer)
                For Each sequence As IEnumerable(Of Integer) In M(p, T1, T2)
                    ' Console.WriteLine(String.Join(", ", sequence))
                    Console.WriteLine(String.Concat(sequence))
                Next
            End Sub
     
        End Class
    C'est hyper rapide et peut être plus facilement compréhensible (pour moi, c'est sûr)... et peut être plus facilement exploitable pour agir sur les boucles ?
    A voir...

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/06/2007, 20h52
  2. Lister toutes les combinaisons d'éléments
    Par Loceka dans le forum Prolog
    Réponses: 5
    Dernier message: 15/04/2007, 00h11
  3. Réponses: 16
    Dernier message: 20/10/2006, 16h31
  4. toutes les combinaisons possibles
    Par marocleverness dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 29/05/2006, 00h11
  5. Lister toutes les combinaisons...
    Par monstroplante dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 04/11/2005, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo