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

Algorithmes et structures de données Discussion :

Permutation utilisant la récursivité!!


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 65
    Par défaut Permutation utilisant la récursivité!!
    S'il vous plaît!
    Comment écrire un program en Java qui génère toutes les permuations de 1..n. ??

    J'ai fait un program comme ça mais il y a des doublons (111, 112,...)

    import java.util.Arrays;

    public class test {

    public test() {
    }


    static int[] a = new int[4] ;

    public static void rechercher(int k) {
    boolean[] b = new boolean[4] ;

    Arrays.fill(b, true);

    for (int i = 1; i <= 3; i+=1)
    if (b[i])
    {
    a[k] = i ;
    b[i] = false ;
    if ( k ==3)
    System.out.println(a[1]+" " + a[2] +" " + a[3]) ;
    else rechercher(k +1) ;


    b[i] = true ;
    }


    }

    public static void main(String args[]){
    rechercher( 1) ;
    }

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    En fait tu peux procéder en trois boucles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Pour i allant de 1 à n
         Pour j allant de 1 à n
              Pour k allant de 1 à n
                   si i != j != k alors
                        afficher i, j, k;
                   fin si
              fin pour
         fin pour
    fin pour
    En fait les doublons partent avec la condition i différent de j différent de k.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 65
    Par défaut Re:
    Dans mon progamme, j'ai pris n = 3 pour tester mais quand n est grand ça sera dur de faire avec les boucles.

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Ok, d'accord, et bien dans ce cas, il te faut une approche récursive, dans ce cas, regarde ceci :

    http://www.developpez.net/forums/viewtopic.php?t=419030

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 65
    Par défaut re:
    Merci!

    Le morceau de code m'a éclairé prk j'ai faux. Le programme correct doit être comme ceci :


    import java.util.Arrays;

    public class test {

    public test() {
    }


    static int[] a = new int[4] ;
    static boolean[] b = new boolean[4] ;


    public static void rechercher(int k) {

    for (int i = 1; i <= 3; i+=1)
    if (b[i])
    {
    a[k] = i ;
    b[i] = false ;
    if ( k ==3)
    System.out.println(a[1]+" " + a[2] +" " + a[3]) ;
    else rechercher(k +1) ;


    b[i] = true ;
    }


    }

    public static void main(String args[]){
    Arrays.fill(b, true);
    rechercher( 1) ;
    }

    Je pense que c'est plus léger par rapport à l'autre code au fait qu'il ne garde en mémoire qu'un entier à chaque profondeur (l'autre code garde 2 chaînes).

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Attention, le programme donné dans le lien donne tous les anagrammes, ce n'est pas ce que semble vouloir dongnold

    Un algo itératif pour faire ce qui est recherché, tous les nombres possibles de 111111111 (n fois) à nnnnnnnnnn (nfois);
    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
     
    entier max : nombre d'éléments à permuter
    entier tab[max+1] : tableau des nombres représentant les permutations, numerotation à partir de 1, +1 pour avoir des tests simples de fin d'incrementation
    entier i : un compteur
     
    début
      remarque : intialisation du tableau 
      pour i de 1 à max par pas de 1
        tab[i] <- 1
      fin pour
     
      remarque : début de l'algo prorpement dit
      faire
        afficher la permutation tab
        remarque : on incrémente la première position de la table, comme on utilise une boucle, 
        remarque : et qu'on augmente l'indice dans la boucle on part de 0
        i <- 0
        faire
          i <- i + 1
          tab[i] <- tab[i] + 1
          remarque : si la position i contient le plus grand nombre on revient au départ, et on continue l'incrémentation
          si tab[i] = max alors
              tab[i] <- 1
          fin si
        tant que tab[i] = 1 
        remarque on n'a pas besoin de tester i avant à cause de la taille du tableau max +1, l'algo s'arrête si on a incrémenté la case supplémentaire, indiquant qu'on a eu toutes les permutations avant
      tant que i <= max 
    fin
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

  1. Sauriez-vous me dire comment la récursivité est utilisée ici (AB comptage des noeuds)
    Par beegees dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 20/03/2008, 22h33
  2. Récursivité, permutations d' éléments dans un tableau
    Par baeri dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 29/01/2007, 20h29
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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