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

C# Discussion :

[C#] Method récursive ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut [C#] Method récursive ?
    Bonjour,

    J'aimerai développer une méthode me permettant de "distribuer" des voyelles dans une liste... mais je bloque !

    j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            enum Voyelles
            {
                A = 0,
                E = 1,
            }
     
     
                List<String> lstTest = new List<String>();
                lstTest.Add("B");
                lstTest.Add("C");
                lstTest.Add("D");
    J'aimerai obtenir en sortie une List<List<String>> qui aurait comme listes :

    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
     
     
                List<List<String>> sortie = new List<List<string>>();
                List<String> lst1 = new List<String>();
                lst1.Add("B");
                lst1.Add("C");
                lst1.Add("D");
                lst1.Add("A");
     
                List<String> lst2 = new List<String>();
                lst1.Add("B");
                lst1.Add("C");
                lst1.Add("A");
                lst1.Add("D");
                lst1.Add("A");
                //...
                sortie.Add(lst1);
                sortie.Add(lst2);
                //...
    De tel sorte que l'enum (les voyelles) forme toutes les combinaison possible, sauf qu'une voyelle doit être à coté de consonnes (ou une seule si en bout de chaîne), autrement dit il ne doit pas y avoir 2 voyelles à coté.

    Voici un exemple de résultat :

    BCDA
    BCADA
    BACADA
    ABACADA
    BCDE
    BCADE
    BCADE
    BACADE
    ABACADE
    ...
    BCAD
    BACAD
    ABACAD
    BCED
    BACED
    ABACED
    ...
    BACD
    ABACD
    EBACD
    BECD
    ABECD
    EBECD
    ...
    ABCD
    EBCD
    (il n'y a pas toutes les combinaisons dans cet exemple)

    Chaque ligne représente une Liste<String> où chaque lettre est dans un String. (j'ai volontairement simplifier mon problème)

    Si vous avez des pistes à me donner ? J'ai commencé une méthode récursive mais je n'arrive pas au bon résultat.

    Merci

    édit: attention, ma liste de départ peut contenir de 1 à N élément (beaucoup)

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 359
    Par défaut
    Voila où j'en suis :
    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
    30
    31
    32
    33
     
            private List<List<string>> maMethode(List<string> lstTest)
            {
                List<List<string>> locale = new List<List<string>>();
                List<List<string>> localeBis = new List<List<string>>();
                List<string> copie = new List<string>(lstTest);
                int capa = lstTest.Count;
     
                for (int i = 0; i < capa+1; i++)
                {
                    locale.Add(new List<string>(lstTest));
     
                }
     
                foreach (var item in locale)
                {
                    foreach (Voyelles v in Enum.GetValues(typeof(Voyelles)))
                    {
                        List<string> tmp = new List<string>(copie);
                        tmp.Insert(capa, v.ToString());
                        localeBis.Add(tmp);
                    }
                    capa--;
                }
     
                locale.Clear();
                foreach (var item in localeBis)
                {
                    locale.Add(item);
                }
     
                return locale;
            }
    C'est pas très jolie pour le moment j'obtiens une partie du résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    BCDA
    BCDE
    BCAD
    BCED
    BACD
    BECD
    ABCD
    EBCD
    il me manque tous les résultats avec 2 voyelles ou plus...

  3. #3
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Je ne suis pas sur d'avoir bien compris le problème, mais ceci pourra te donner des pistes.

    Objectif de la procédure récursive :
    A partir d'un résultat "Mot" de N lettres, ajoutons au résultats l'ensemble des string de N+1 lettres obtenus en ajoutant à "Mot" une lettre de plus.
    Les conditions à respecter étant :
    - si la dernière lettre de Str est une voyelle, on ne pourra ajouter qu'une consonne,
    - les lettres qui peuvent être ajoutées ne doivent pas être dèjà contenues dans Mot.

    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
     
    int n  = 7 ; // nombre de lettres maxi des mots 
    string Consonnes = "ABCDFG" ;
    string Voyelles = "AEI" ;
    List<String> Resultats = new List<String>() ;
    Build("") ;
     
    internal void Build(Mot String)  // La procédure récursive
    {   // ajout de consonnes
      for (j=0;j<Consonnes.Length;j++) if (Mot.IndexOf(Consonnes[j]<0) 
      {
         Resultats.Add(Mot+Consonnes[j]) ;
         if (Mot.Length<n) Build(Mot+Consonnes[j]) ; 
      }
      // ajouts de voyelles
      if (Voyelles.IndexOf(Resultats[i][Mot.Length-1])<0) 
      for(j=0;j<Voyelles.Length;j++) if (Mot.IndexOf(Voyelles[j]<0) 
      {
         Resultats.Add(Mot+Voyelles[j]) ;
         if (Mot.Length<n) Build(Mot+Voyelles[j]) ; 
      }
    }

Discussions similaires

  1. Expression arithmetique Methode récursive
    Par zana74 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 15/10/2007, 18h06
  2. [METHODE] -> Détection de virus ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/02/2004, 17h04
  3. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  4. Methode de drcherche a l,interieur de basse de donner texte
    Par philippe V dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 03/12/2002, 10h20
  5. Procédure Récursives
    Par DocCoinCoin dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 30/10/2002, 19h27

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