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 :

[algoritmique][débutant]Méthode récursive


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de lejimi
    Homme Profil pro
    Écrivain public
    Inscrit en
    Mai 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Écrivain public
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2004
    Messages : 182
    Billets dans le blog
    2
    Par défaut [algoritmique][débutant]Méthode récursive
    Bonjour,

    J'ai écrit une méthode save dont voici le code :

    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
        public void save() {
            if (fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
                System.out.println("Début save");
     
                File fichier=fc.getSelectedFile();
     
                // Supprimer l'extension erronée, puis
                // Rétablir la bonne extension si elle n'est pas fournie par l'utilisateur
                if(Extension.getExtension(fichier)!="bing"){               
                    //System.out.println("Avant : "+fichier.getName()+" "+fichier.getPath());
                    fichier=Extension.removeExt(fichier);
                    String n=fichier.getPath();
                    n+=".bing";
                    fichier=new File(n);
                    //System.out.println("Après : "+fichier.getName()+" "+fichier.getPath());
                }
     
                if(fichier.exists()){
                    String mess="Etes-vous sûr de vouloir remplacer ce fichier ?";
                    int rep=JOptionPane.showConfirmDialog(fc,mess,
                            "Attention",JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
                    if(rep!=JOptionPane.YES_OPTION){
                        save(); // Possibilité de nombreuse méthodes s'exécutant simultanément...
                    }
                }
     
                try {
                    FileOutputStream sauve = new FileOutputStream(fichier);
                    ObjectOutputStream oos = new ObjectOutputStream(sauve);
                    for (int i = 0; i < NUMGRIDS; i++) {
                        oos.writeObject(grids[i]);
                    }
                    oos.flush();
                    oos.close();
                } catch (IOException e) {
                }
            }
     
            System.out.println("Fin save");
        }
    Une partie de celle-ci demande une confirmation à l'utilisateur lorsque celui-ci s'apprête à écraser un fichier. En cas de non-confirmation, la méthode s'appelle à nouveau elle même afin de permettre le choix d'un nouveau fichier. C'est là que se trouve mon soucis, car à l'extrème je peux me retrouver avec de très nombreuses méthodes save() s'excécutant de manière imbriquée, et là... youyouye mémoire !

    Comment faire pour éviter cela ?

    Merci,

    S.
    Gloire à qui n'ayant pas d'idéal sacro-saint
    Se borne à ne pas trop emmerder ses voisins.


    Mon tutoriel pour débuter avec Inkscape
    D'autres tutoriels intéressants dans la rubrique Open Source
    Et n'oubliez pas la FAQ Open Source !

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    utilise une méthode non-récursive

    pour des besoins comme ceux-là, une simple boucle suffit largement, pourquoi utiliser la récursivité ?

    mais si vraiment tu y tiens, tu peux toujours insérer une instruction "return;" après l'appel du save récursif

  3. #3
    Membre expérimenté
    Avatar de lejimi
    Homme Profil pro
    Écrivain public
    Inscrit en
    Mai 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Écrivain public
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2004
    Messages : 182
    Billets dans le blog
    2
    Par défaut
    En fait je dois être un peu tordu car je ne vois pas du tout comment éviter cette fameuse récursivité... L'idéal si l'utilisateur ne veux pas écraser me semble bel et bien de revenir au tout début de ma méthode save()

    Comment l'ensemble se comporte-t-il en insérant le return là où tu le dit ? Le programme passe à chaque tour par la ligne "Début save" mais une seul par la ligne "Fin save"
    Gloire à qui n'ayant pas d'idéal sacro-saint
    Se borne à ne pas trop emmerder ses voisins.


    Mon tutoriel pour débuter avec Inkscape
    D'autres tutoriels intéressants dans la rubrique Open Source
    Et n'oubliez pas la FAQ Open Source !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Si le programme arrive à un return;, la fonction qui est en train de s'éxécutée se finie et tu reviens juste en dessous de son appel.
    Dans ton cas, je crois effectivement que la récursivitée n'apporte pas grand chose à part mal à la tête.

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par lejimi
    Comment l'ensemble se comporte-t-il en insérant le return là où tu le dit ? Le programme passe à chaque tour par la ligne "Début save" mais une seul par la ligne "Fin save"
    c'est bien le but non ? avec le return, les lignes placées en dessous ne sont pas exécutée, c'est comme si tu remontais directement en début de méthode save

  6. #6
    Membre expérimenté
    Avatar de lejimi
    Homme Profil pro
    Écrivain public
    Inscrit en
    Mai 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Écrivain public
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2004
    Messages : 182
    Billets dans le blog
    2
    Par défaut
    Avec return, ça marche impec et j'obtiens effectivement le résultat voulu 8) . Et par curiosité, Pill_s comment ferais-tu pour eviter la récursivité ? Je sèche... Si tu avais un lien vers un bout de code ?
    Gloire à qui n'ayant pas d'idéal sacro-saint
    Se borne à ne pas trop emmerder ses voisins.


    Mon tutoriel pour débuter avec Inkscape
    D'autres tutoriels intéressants dans la rubrique Open Source
    Et n'oubliez pas la FAQ Open Source !

  7. #7
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    bah, un peu de réflexion...

    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
     
    public void askAndSave() {
      boolean saved=false;
     
      while(! saved) {
        if(fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
          File f = fc.getSelectedFile();
     
          if(f.exists()) {
            JOptionPane.showInformationMessage("Unable to overwrite !");
          } else {
            // do save
            saved = true;
          }
        }
      }
    }

  8. #8
    Membre expérimenté
    Avatar de lejimi
    Homme Profil pro
    Écrivain public
    Inscrit en
    Mai 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Écrivain public
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2004
    Messages : 182
    Billets dans le blog
    2
    Par défaut
    Oui, effectivement, ce qui revient à placer l'ensemble de ma méthode dans une boucle, alors que moi je cherchais à placer une boucle à l'intérieur de la méthode (Comment former quatre triangles équilatétraux avec six alumettes : )

    Comme quoi beaucoup de réflexion ne suffit pas quand elle ne va pas dans le bon sens

    A plus,

    S.
    Gloire à qui n'ayant pas d'idéal sacro-saint
    Se borne à ne pas trop emmerder ses voisins.


    Mon tutoriel pour débuter avec Inkscape
    D'autres tutoriels intéressants dans la rubrique Open Source
    Et n'oubliez pas la FAQ Open Source !

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

Discussions similaires

  1. [Débutant] Méthode de Newton
    Par foujeu dans le forum MATLAB
    Réponses: 18
    Dernier message: 20/12/2006, 11h09
  2. [EJB] [débutant] [Méthode]EJB et présentation web
    Par Eric Berger dans le forum Java EE
    Réponses: 6
    Dernier message: 03/08/2006, 23h42
  3. Réponses: 2
    Dernier message: 05/01/2006, 14h17
  4. Vérification du parenthèsage (méthode récursive)
    Par Saiyan dans le forum C++Builder
    Réponses: 7
    Dernier message: 14/12/2005, 16h54
  5. [Débutant] Méthode super()
    Par KooX dans le forum Langage
    Réponses: 3
    Dernier message: 07/11/2004, 21h28

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