Recursion

Recursion - Algo - Programmation

Marsh Posté le 04-04-2006 à 19:55:35    

Bonjour tout le monde,
 
Je vous expose mon probleme :
J’ai une table de X lignes contenant chacune une cellules de Y possibilitées. Je voudrais developper (En Delphi 5 sur WinXp pro), une fonction me permettant d’obtenir toute les combinaisons possibles.
 
Exemple :
Table                                                    Combinaisons désirées:
Lignes              Cellules
A                      1;2;3;                ->         A1        A1        A1        A1        A1        A1        A1  …
B                      2;                     ->         B2        B2        B2        B2        B2        B2        B2    …
C                      1;                     ->         C1        C1        C1        C1        C1        C1        C1  …
D                      1;2;3;                ->         D1        D1        D1        D2        D2        D2        D3  …
E                      1;2;3;                ->         E1        E2        E3        E1        E2        E3        E1   …
 
Il est clair que la solution passe par une fonction récursive, mais je n’arrive pas à mettre le doigt sur la logique à suivre.
 
J’ai pour l’instant développer l’algo suivant (Naturellement il ne marche pas) :
 
Procedure RecursSearch(TableOrigine, TableSauvegarde)
   //Boucle sur le nombre de possibilités contenu dans la cellule (A1, A2, A3 : i =3)  
   Pour i = 0 tant que i < TableOrigine[PosCourante].NombreContenu alors    
      //On Copie l’entrée courante (A1, D3, E2, ...) dans la table de sauvegarde
      TableSauvegarde.NouvelEnregistrement.IndexChoisi <- TableOrigine[PosCourante].Index[i]
         //Si il n’y a plus de ligne on à un combinaison complete, sinon on boucle
         Si TableOrigine[PosCourante].Fin = faux alors                                                    
            TableOrigine.PosSuivante      //Saut à la ligne suivante dans la table d’origine
            RecursSearch (TableOrigine, TableSauvegarde)                                       //Recursion
         Fin Si
   Fin Pour
Fin Procedure
 
Quelqu’un saurais-t’il, par hasard, ou trouver un exemple d’algorithme pouvant résoudre ce probleme sur lequel je m’arrache les cheveux depuis déjà beaucoup trop longtemps ??
 
Merci d’avance
Bye

Reply

Marsh Posté le 04-04-2006 à 19:55:35   

Reply

Marsh Posté le 04-04-2006 à 22:35:00    

ton exemple est pas logique (ou confu?)
 
a quoi correspondent les combinaisons désirées?
 
peut tu donner un exemple plus clair et plus petit, avec juste AB et 12?

Reply

Marsh Posté le 04-04-2006 à 23:02:15    

je crois que j'ai compris.  ;)  
Je ferais ça avec une file et un marqueur de fin de file :
 
intialisation de l'algo
  on met dans la file le contenu de toutes les cellules de la première ligne
  on met le marqueur de fin de file
fin de l'intialisation
 
algo proprement dit
 
pour toutes les lignes li restant à  faire
  tant que l'element e_f extrait de la file est différent du marqueur de fin de file faire
    pour tous les cellules c_i de la ligne l_i faire
      créer un nouvel élement n_e en ajoutant a la fin de e_f l'élément c_i
      mettre dans la file n_e
    fin pour
  fin tant que
  mettre dans la file le marqueur de fin de file
fin pour
 
A la fin, tu as dans la file tous les éléments voulus. (si j'ai bien compris ce que tu voulais). :pt1cable:

Reply

Marsh Posté le 04-04-2006 à 23:24:30    

Ok, merci pour le conseil, je vais tester ca.
 
Je redonne un exemple sous forme d'arbre si ca peux aider :
 
La liste des combinaisons que je désire ressemble à ca :  
                        A1                  A2
                  /               \           ...
                B1               B2    
      /          |      \         ...
     C1        C1    C1
     |           |      ...
     D1        D1  
  /  |  \       |   \   \
E1 E2  E3   E1 E2  E3
 
Sachant que le chemin en rouge représente une des combinaisons souhaité.

Reply

Marsh Posté le 05-04-2006 à 14:57:27    

Alors, ça donne quoi ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed