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

Langage Java Discussion :

Problème de récusivité avec chars


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème de récusivité avec chars
    voici le code que j'ai envisagé.

    celui-ci est court et a simplement pour but de donner toutes les solution d'arrangement de "o" lettre parmis "n" (les lettres sont considérées en ordre croissant.)

    voici le code que j'utilise :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    /**
     * 
     * @author (laurent)
     * @version (avril 2007)
     */
    class ls
    { 
     
      public static void main()
        { // main
            int o=3;//nobre de tirages
            char n='d'; // ensemble de départ
            int temp;
            int tmp;
            long tot=0; // compteur
     
            char[] tab1= new char[4];
            for (int i=0; i<tab1.length; i++){
                tab1[i] = 'a';
            }
            char[] tab2= new char[4];
            for (int j=0; j<tab2.length; j++){
                tab2[j] = 'd';
            }
            while(tab1!=tab2){
                temp=tab1[o];
                tab1[o]=(char)temp++;
                for(int k=o;k<=0;k--){
                    if(tab1[k]>n){
                        tab1[k]='a';
                        tmp=tab1[k-1];
                        tab1[k-1]=(char)(tmp++);
                    }//fin if
                }//fin for
                System.out.println(tab1);
                 tot=tot+1;
    }//fin while
            System.out.println("");
            System.out.println("FIN ("+tot+" résultats trouvés");
     
        } // main
    } // class
    la problème, est que celui qui fait une boucle infinie et afiche sans cesse

    aaaa
    aaaa
    ...

    quelqu'un voit il mon erreur?

    merci à vous

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Quelques remarques :

    Citation Envoyé par childof
    for (int i=0; i<tab1.length; i++){
    tab1[i] = 'a';
    }
    se remplace par

    while(tab1!=tab2){
    n'a aucune chance d'etre vrai


    temp=tab1[o];
    tab1[o]=(char)temp++;
    est equivalent a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab1[o] = (char) (tab1[o]+1)
    Par contre, je ne vois pas du tout quel est le resultat attendu

  3. #3
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    quelqu'un voit il mon erreur?
    de laquelle tu parles?

    Pour info la récursivité n'a rien a voir avec ton problème (ta méthode ne s'appelle pas elle-même!).


    Citation:
    while(tab1!=tab2){

    n'a aucune chance d'etre vrai
    pas de bol! ça à toutes les chances d'être vrai, et c'est même tout le temps vrai!
    Comme tu ne rentres jamais dans ta boucle for (k<=0 avec k=o=3) tu ne modifies pas tab1 (enfin pas dans la tranche 0..2). Et donc si tab1!=tab2 est vrai une fois, c'est vrai tout le temps puisque tu ne modifie pas non plus tab2.

    donc...tu ne sort jamais de ta boucle donc:
    aaa
    aaa
    aaa
    ...

    tu y tiens vraiment à ta variable o? parceque déjà des variables d'une lettre c'est pas folichon (encore que i,j,k pour des compteurs de boucle ça va) mais la franchement ça ressemble trop à 0 pour être honnête.

    Sinon si tu préfère faire simple, mais je n'ai peut être pas compris ce que tu voulais faire:
    une table lettres de quatre chars initialisés dans l'ordre à 'a','b','c' et 'd'
    trois boucles for imbriquées avec i,j,k comme compteurs de boucle et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(lettres[i]+lettres[j]+lettres[k]);
    ça t'évite les décrementations, les tests d'arrêts, l'arithmétique sur les chars, les casts et les variables temporaires superflues.
    S'il n'y a pas de solutions, il n'y a pas de problème.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    JMLLB : j'ai fait commùe sa au debut, mais le but est que cela fonctinne avec n et o variable et le rpoblème est que sinon j'ai des

    for(...)
    for(....)
    for(...)
    .....

    en tout cas merci pour les remarque.

    pour la recusivité, je parle de récusivité mathématique


    le resutat attendu est :

    aaaa
    aaab
    aaac
    aaad
    aaba
    aabb
    aabc
    aabd
    aaca
    ....

  5. #5
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    pour la recusivité, je parle de récusivité mathématique
    Ah! d'accord maintenant c'est plus clair!

    Non, sans rire, la récursivité c'est la récursivité, mathématique ou pas!

    Bon maintenant que je comprend mieux ce que tu veux faire, la manière la plus simple de traiter ton pb est effectivement la recursivité.

    Mais ce n'est pas du tout ce que tu fais pour l'instant.
    Il faut que tu définisses une méthode qui va s'appeler elle même.

    du genre:

    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
    void traitementRecursif(
      int profondeurCourante_in,
      int profondeurMax_in,
      int nbLettresDistinctes_in,
      String mot_in){
      if (profondeurCourante_in<=profondeurMax_in){
        for(int i=0;i<nbLettresDistinctes_in;i++){
          this.traitementRecursif(
            profondeurCourante_in+1,
            profondeurMax_in,
            nbLettresDistinctes_in,
            mot_in+this.lettres[i]);
         }
       }else{
         System.out.println(mot_in);
       }
    }
    tu n'as plus qu'à appeler cette méthode dans ton main.

    Généralement lorque l'on peut éviter la récursivité on préfère. C'est plus simple à coder qu'une solution itérative pure, mais en terme de performance ce n'est pas compétitif.
    S'il n'y a pas de solutions, il n'y a pas de problème.

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En java, sur les dernières versions de la JVM c'est tangeant car le compilo r"alise de optis sur tout ce qui est récursivité, et en général j'ai tendance à préférer un code synthétique et propre qu'une horreur de bidouille itérative. (et de toute façon dès que tu bosses sur des arbres de décision, du backtrack & cie... l'itératif n'est pas envisageable)
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    En java, sur les dernières versions de la JVM c'est tangeant car le compilo réalise de optis sur tout ce qui est récursivité
    Je suis un peu surpris, mais c'est plutôt une bonne nouvelle.

    Enfin pour le cas présent qui est simple une solution itérative est a peu de chose près aussi compacte est claire (un while un for et test de propagation de la retenue et c'est réglé).
    S'il n'y a pas de solutions, il n'y a pas de problème.

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Voilà les test que je cherchais à ce propos.

    http://www.ahmadsoft.org/articles/recursion/index.html
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  9. #9
    Membre actif
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Points : 268
    Points
    268
    Par défaut
    j'avoue c'est pour le moins étonnant.

    Si tu as un bench comparable en c je serai intéressé de comparer. Pas de comparaison Java/c (j'ai pas envie de relancer une polémique sans grand intérêt) mais juste voir les ordres de grandeurs itératifs récursifs sur un petit prog c.
    S'il n'y a pas de solutions, il n'y a pas de problème.

  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    J'aurais eu un env de dev C et le structures arborescente sous la main, je l'aurais fait, mais là je n'ais àdispo ni l'un ni l'autre et un peu la flemme de passer trois heures à m'engueuler avec windows et ses path...

    Et comme ma machine linux est en rade (proc mort)....
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

Discussions similaires

  1. Probléme de pointeur avec des pointeurs de char *
    Par marime dans le forum Débuter
    Réponses: 4
    Dernier message: 30/09/2013, 13h14
  2. Problème avec char
    Par choupinette116 dans le forum Débuter
    Réponses: 7
    Dernier message: 23/04/2008, 10h30
  3. Classe clavier problème avec char
    Par benjiprog dans le forum Langage
    Réponses: 30
    Dernier message: 30/06/2006, 16h04
  4. Problème de buffer avec des int et des char
    Par Lolita59 dans le forum Réseau
    Réponses: 23
    Dernier message: 04/05/2006, 11h09
  5. [PostgreSql] Problème de cadreage de char !!!
    Par moipastoi dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/05/2003, 18h01

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