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 :

Profondeur de la récursion


Sujet :

Langage Java

  1. #1
    Invité
    Invité(e)
    Par défaut Profondeur de la récursion
    Bonjour à tous,

    En Java, je veux écrire une méthode qui n'a pas de paramètre et mettre au point un algorithme récursif avec cette méthode (en fait, je réécris la méthode toString d'une classe quelconque, donc elle n'a pas de paramètre).
    Mon problème, c'est qu'il faut que la String retournée affiche du texte indenté, et pas n'importe comment: a chaque "imbrication" (a chaque nouvel appel de la fonction par elle-même), il faut indenter d'une tabulation en plus.
    Ce qui me manque donc, c'est le nombre de fois que j'ai appelé la fonction récursive, ce que j'appelle (peut-être à tort) la "profondeur" de la récursion.

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Appel 1
        Appel 2
            Appel 3
            Appel 3
                Appel 4
            Appel 3
    Appel 1
    Si vous connaissez un moyen simple et rapide d'obtenir cet entier, sans passer par un paramètre supplémentaire de la méthode, merci de le partager.
    Et si au passage vous connaissez une astuce pour concaténer n fois le même caractère à une String, c'est cool aussi.
    Genre "\t" concaténé 8 fois à la String afficher, sans passer par une boucle for.

    Merci !

  2. #2
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    je pense qu'il suffirait d'incrémenter une variable statique dans la méthode récursive. Genre dans la méthode principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static int compteur = 0;
    Puis dans la méthode récursive:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String maMethodeRecursive()
    {
      ++compteur;
      /.../
    }
    La variable statique n'existe qu'une fois dans le programme...il y a des explications un peu partout sur ce type de variable pour avoir plus de détails sur le sujet.

    En espérant que cela vous aide...
    @ bientôt...

    Salut & @+ sur 3W!

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    la méthode propre, c'est d'avoir toString qui n'est pas récursif, mais délègue son travail à un méthode recursive. Vous n'aurez alors pas de soucis en multithread et éviterez de construire des strings inutiles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public String toString(){
        StringBuilder sb = new StringBuilder();
        return toStringRecursif(sb,0).toString();
    }
    protected StringBuilder toStringRecursif(StringBuilder builder, int deep){
         builder.append(......);
         ....
         unObject.toStringRecursif(builder,deep+1);
         unAutreObject.toStringRecursif(builder,deep+1);
         return builder;
    } 
     
     
    monObjet.toString();

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos conseils.
    Même si, je l'avoue, je ne comprends pas tout.
    Finalement j'ai réglé mon problème en m'apercevant que la méthode toString fonctionne avec un paramètre entier.

    Mais ma question c'était plus :
    Connaissez-vous un moyen (une méthode déjà implémentée dans java) d'obtenir un entier qui corresponde à la "profondeur de récursion" ("je me situe dans l'appel numéro combien?"), sans passer par un paramètre de la méthode récursive. Quelle que soit ladite méthode récursive (que ce soit toString ou pas; ça c'était juste pour contextualiser ma question).

    Merci.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    non, il n'y a pas

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    non, il n'y a pas
    Dans l'absolu, si c'est possible en passant par la stacktrace (tant que la récursivité reste dans le même thread).

    Après, je le conçois, c'est un moyen lourd et à n'utiliser que dans certains cas très particuliers (dont ne fait pas partie le problème de la profondeur de récursivité).

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le stacktrace ne va pas vous donner la "profondeur de récursion", Tu peux avoir 10 lignes dans le stacktrace et être en récursion, comme tu peux avoir 150 ligne et ne pas être en récursion.

  8. #8
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Je parlais d'analyser la stacktrace, pas de simplement compter le nombre de lignes

  9. #9
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    La solution de la variable static est probablement la pire.

    Comme dit tchize_ rien ne t'empêche de considérer ta méthode toString() comme point d'entré de ta récursion et faire le travail ailleurs pour ajouter un état à ta boucle et avoir une profondeur.

    tu peux avoir une méthode _toString(int profondeur); avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public String toString() { return _toString(0); }
    En fonction de l'importance de ton projet (en taille et en durée de vie) tu pourrai avoir un visiteur qui explore ta structure et compose ta sortie sous forme d'arbre.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Profondeur insufisante
    Par Dr@ke dans le forum OpenGL
    Réponses: 4
    Dernier message: 26/02/2005, 14h30
  2. algo de recherche en profondeur
    Par sylsau dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/02/2005, 22h59
  3. [DEBUTANT] [GLUT] profondeur de vision dans l'ecran
    Par barthelv dans le forum OpenGL
    Réponses: 3
    Dernier message: 17/11/2004, 16h59
  4. Bug avec le test de profondeur
    Par Tellmarch dans le forum OpenGL
    Réponses: 1
    Dernier message: 17/10/2004, 00h59
  5. Problème de profondeur
    Par nans80 dans le forum OpenGL
    Réponses: 4
    Dernier message: 07/04/2004, 21h51

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