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

Java Discussion :

Fonction récursive en Java


Sujet :

Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut Fonction récursive en Java
    bonjour, en fait j'ai une fonction récursive, voici le code de cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void partageToutLeMonde(PageFacebook p, Publication pub){
        	for(int i=0; i<p.getAmis().size();i++){
        		PageFacebook pageAmi=p.getAmis().get(i);
        		pageAmi.setPublicationReçues(pub.getIdPublication());
        		float pourcentage=pourcentagePartage();
        		boolean a=partagerPublicationReçueSurMonMur(pageAmi,pub,pourcentage);
        		if(a==true){
        			partageToutLeMonde(pageAmi,pub);
        		}
        	}
        }
    si je fais l'exécution l'erreur suivante est affiché:Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    et cet erreur est affiché car la fonction entre dans une boucle infinie et donc il n'y a pas condition d’arrêt. le pb je n'arrives pas à voir comment résoudre ça et honnêtement je suis bloquée sur cette fonction ça fait longtemps.
    une autre remarque si une page est ami avec une autre ce lien est bidirectionnel c'est à dire si la page 3 est ami avec la page 0 alors la page 0 est aussi ami avec la page3 et je penses que ceci qui cause le pb de boucle infinie.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par boubounagh Voir le message
    [...] je penses que ceci qui cause le pb de boucle infinie.
    En effet, cela doit en être la cause. Car avec ton exemple, si tu commences par passer par la page 3, cela va te lancer la page 0, qui à son tour va lancer la page 3, etc.

    Une solution pourrait être d'avoir un marqueur (par ex. estDiffusee) pour ton objet PageFacebook, que tu passerais à true lorsque tu la traites. Cela évitera les redondances comme noté ci-dessus.

    Mako.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    s'il vous plait pouvez vous m'expliquer un peu plus la notion de marqueur et une autre chose est ce que vous pensez que le code de la fonction est juste et il me manque juste la nation de marqueur?

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    les amis de mes amis sont mes amis
    est-ce que je fais partie des amis de mes amis?

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par boubounagh Voir le message
    s'il vous plait pouvez vous m'expliquer un peu plus la notion de marqueur
    Code PageFacebook.java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class PageFacebook {
     
        // Permet de savoir si une page a ete traitee ou non
        // lors de la methode recursive
        public boolean aEteDiffusee = false;
     
        // Reste de la classe
        ...
    }

    Code methodeRecursive : 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
     
    public void partageToutLeMonde(PageFacebook p, Publication pub){
         for(int i=0; i<p.getAmis().size();i++){
              PageFacebook pageAmi=p.getAmis().get(i);
              // On regarde si la page a deja ete traitee
              if (pageAmi.aEteDiffusee) {
                   // C'est le cas, on ne fait donc plus rien ici
                   return;
              } else {
                  // Pas encore traitee, on le fait
                  pageAmi.setPublicationReçues(pub.getIdPublication());
                  float pourcentage=pourcentagePartage();
                  boolean a=partagerPublicationReçueSurMonMur(pageAmi,pub,pourcentage);
                  // On tope la page comme ayant ete traitee
                  pageAmi.aEteDiffusee = true;
                  // Est strictement equivalent a if(a==true), mais en plus court...
                  // On pourrait meme mettre directement : if (partagerPublication...)
                  if(a){
                      partageToutLeMonde(pageAmi,pub);
                  }
              }
        }
    }

    En plus de cela, il faut, avant d'appeler ta méthode récursive, t'assurer que toutes les pages sont bien encore non-traitées (il faut donc parcourir toutes tes pages, et mettre aEteDiffusee a false avant l'appel à la méthode).

    Citation Envoyé par boubounagh Voir le message
    est ce que vous pensez que le code de la fonction est juste et il me manque juste la nation de marqueur
    Pour ça, je ne sais pas quel était l'objectif initial, ce que font les méthodes appelées, etc. Il est donc difficile de dire si cela fonctionne correctement ou non. Pour ce qui est de la récurrence à proprement parlé, cela me semble bon...

    Mako.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    merci pour ta réponse et toutes ces explications je vais tester ça et voir s'il résout le pb.

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    ça va le pb est résolu donc merci bien pour vous.
    mais j'ai un autre pb qui est plus au moins lié à cette fonction récursive.
    en fait dans cette fonction je me connecte à la base de données pour faire l'insertion puis une fois je termine l'insertion je fait l'affichage du contenue de ma table dans un fichier texte alors si je fais ça maintenant une erreur s'affiche et qui indique que la base est ouverte plusieurs fois ou quelque chose comme ça.

  8. #8
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par boubounagh Voir le message
    ça va le pb est résolu donc merci bien pour vous.
    mais j'ai un autre pb qui est plus au moins lié à cette fonction récursive.
    en fait dans cette fonction je me connecte à la base de données pour faire l'insertion puis une fois je termine l'insertion je fait l'affichage du contenue de ma table dans un fichier texte alors si je fais ça maintenant une erreur s'affiche et qui indique que la base est ouverte plusieurs fois ou quelque chose comme ça.
    Merci d'être plus claire et structuré sur le problème ainsi que précis sur les erreurs ou portions de code. Ce post en l'état est plutôt difficile à suivre.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    en fait j'ai une question à propos le code proposé par Mako:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (pageAmi.aEteDiffusee) {
                   // C'est le cas, on ne fait donc plus rien ici
                   return;
              }
    je ne comprends pas bien cet instruction lorsqu'on dit return elle va d’où recommencer.
    une autre chose c'est vrai que j'ai besoin de la fonction récursive pour partager les publications mais aussi je veux que chaque itération de ma fonction soit enregistré dans ma table de base de donnée puis afficher le contenue de ma table dans un fichier texte mais selon mon code cette fonction ne parcourt pas toute la liste des amis des pages Facebook
    voici le code de ma fonction:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    public void partagerPublicationReçueAToutLeMonde(PageFacebook p,Publication pub){
        	PrintWriter fluxSortie = null;
    		try
    		{
    		fluxSortie =
    		new PrintWriter(new FileOutputStream("partagePubCreesAToutLeMonde.txt"));
    		}
    		catch(FileNotFoundException e)
    		{ System.out.println("Erreur d’ouverture fichier.txt.");
    		System.exit(0);
    		}
     
    		fluxSortie.print("Num Du Reseau		");
    		fluxSortie.print("Id Page Creatrice Du Pub 		");
    		fluxSortie.print("Id Publication Créee	");
    		fluxSortie.print("Id Ami Reçu Pub 	");
    		fluxSortie.print("Pourcentage De Partage 		");
    		fluxSortie.print("Decision De Partage 		");
    		fluxSortie.print("Id Ami Reçu Publication Partagée 		");
    		fluxSortie.println(" ");
        	Connection connexion;
            Statement statement;
            ResultSet resultat;
            try{
                    Class.forName("com.mysql.jdbc.Driver");
                    connexion=DriverManager.getConnection("jdbc:mysql://localhost/memoire","root","boutheina");
                    statement = connexion.createStatement();
        	for(int i=0;i<p.getAmis().size();i++){
        		PageFacebook pageAmi=p.getAmis().get(i);
        		if(pageAmi.aEteDiffusee){
        			return;
        		}
        		else{
        		pageAmi.setPublicationReçues(pub.getIdPublication());
        	   float pourcentage=pourcentagePartage();
     
       		boolean a=partagerPublicationReçueSurMonMur(pageAmi,pub,pourcentage);
       		pageAmi.aEteDiffusee=true;
       		if(a==false){
     
        		 String queryString = "INSERT INTO partagePubCreesAToutLeMonde" +
               	 		"(reseau,idPageCreatrice,idPubCreee,idAmiRecuPub,pourcentagePartage,decisionPartage)" +
               	 		 " VALUES ((SELECT MAX(numReseau)FROM reseau),"+p.getIdPage()+","+pub.getIdPublication()+","+pageAmi.getIdPage()+","+pourcentage+","+a+")";
        		           statement.executeUpdate(queryString);
        		           //return;
        	}
       		if(a==true){
     
            	//	pageAmiDeMonAmi.setPublicationReçues(pub.getIdPublication());
            		String queryString = "INSERT INTO partagePubCreesAToutLeMonde" +
                   	 		"(reseau,idPageCreatrice,idPubCreee,idAmiRecuPub,pourcentagePartage,decisionPartage,idAmiRecuPubPartagee)" +
                   	 		 " VALUES ((SELECT MAX(numReseau)FROM reseau),"+p.getIdPage()+","+pub.getIdPublication()+","+pageAmi.getIdPage()+","+pourcentage+","+a+","+pageAmi.getAmis().get(i).getIdPage()+")";
            		           statement.executeUpdate(queryString);
       			partagerPublicationReçueAToutLeMonde(pageAmi,pub);
       		}
     
     
        	}
        	}
       	 resultat = statement.executeQuery("SELECT * FROM partagePubCreesAToutLeMonde");
         while(resultat.next()){
         	 fluxSortie.print("      ");
         	 fluxSortie.print(resultat.getInt("reseau"));
         	 fluxSortie.print("                         ");
         	 fluxSortie.print(resultat.getInt("idPageCreatrice"));
         	 fluxSortie.print("                      ");
         	 fluxSortie.print(resultat.getInt("idPubCreee"));
         	 fluxSortie.print("                      ");
         	 fluxSortie.print(resultat.getInt("idAmiRecuPub"));
         	 fluxSortie.print("                      ");
         	 fluxSortie.print(resultat.getDouble("pourcentagePartage"));
         	 fluxSortie.print("                         ");
         	 fluxSortie.print(resultat.getBoolean("decisionPartage"));
         	 fluxSortie.print("                        ");
         	 fluxSortie.print(resultat.getInt("idAmiRecuPubPartagee"));
     
         	 fluxSortie.println(" ");
         	 fluxSortie.println("****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************");
         }
        	}
     
     
     
     
          catch(Exception e){
           	 e.printStackTrace();
                System.out.print("Impossible de se connecter à MySQL");
     
       }
            fluxSortie.close( );
     
        }

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2011
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 119
    Par défaut
    ça va le pb est résolu.

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

Discussions similaires

  1. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  2. Fonction eval en java ?
    Par ramislebob dans le forum Langage
    Réponses: 2
    Dernier message: 12/01/2006, 00h22
  3. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  4. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12
  5. [Info] Appeler une fonction Ada95 depuis Java
    Par mmathieu dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 15/09/2005, 09h42

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