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 :

Compilation java, Maximum() sur liste chaînée


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2015
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Compilation java, Maximum() sur liste chaînée
    Bonjour à tous, j'aurais besoin d'aide sur la compréhension de la compilation d'un petit script java, l'idée est de me retourner le max d'une liste chaînée par récursion.

    Comment ( et dans quel ordre) va être compilé ce 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
    public int Maximum(Cellule c){
     
    		if (c.suivant != null){
     
    			int max = Maximum(c.suivant);
    			if(max < c.valeur){
    				max = c.valeur;
    			}
     
    			return c.valeur;
    		}
    		else 
    			return c.valeur;
    	}
    Je ne comprends pas en ce sens :
    selon moi, à chaque appel de Maximum() on recommence le code au départ sans passer au if, ce qui fait donc tourner en rond jusqu'à la fin de la liste où au final on retourne c.valeur par défaut.

    pour appuyer mon code, voici le code de ma liste chaînée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Liste_chaînée {
     
    	public Cellule tete;
     
     
    	//constructeur
    	 Liste_chaînée(){
     
    		tete = null;
     
    	}
    et d'une cellule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Cellule {
     
    	public int valeur;
    	public Cellule suivant;
     
    	//constructeur
    	Cellule(int _valeur){
     
    		valeur = _valeur;
    		suivant = null;
    	}
     
    }
    je vous remercie d'avance pour votre temps et votre lecture

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Comment va être compilé ce code ?
    Avec diligence.

    Dans quel ordre va être compilé ce code ?
    Qu'est-ce que ça peut bien te faire l'ordre de compilation ?
    La compilation transforme tes fichiers *.java en fichiers *.class exécutables interprétables par une JVM (Java virtual machine).
    Aux moment de l'exécution, tous les objets sont présents et compilés.

    selon moi, à chaque appel de Maximum() on recommence le code au départ sans passer au if, ce qui fait donc tourner en rond jusqu'à la fin de la liste où au final on retourne c.valeur par défaut.
    Le "sans passer au if " est abusif puisqu'on rentre dedans pour que la méthode s'appelle elle-même.
    C'est essentiel. Tu fabriques par ce biais ton point d'arrêt.

    Sinon, tu as tout compris.

    À la première lecture, il y a quand même quelque chose de choquant dans ton code:
    Dans un cas, tu retourne c.valeur et dans l'autre cas, c.valeur !!!
    Ne te casse pas le tronc et renvoie directement c.valeur sans condition ...

    Moins ironiquement, il me semble que tu veux renvoyer max et non c.valeur.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    il y a quelque chose qui me parait incoherent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public int Maximum(Cellule c)
    {  if (c.suivant != null)
        { int max = Maximum(c.suivant);
           if(max < c.valeur)
           { max = c.valeur; }
         return c.valeur; // ici tu est sur de retourner c.valeur ?  perso j'aurais mis la valeur de max 
         }
         else 
        return c.valeur;
    }
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tout d'abord, ta question ne concerne pas la compilation (transformation du code source en bytecode exécutée par la JVM pour Java, et plus généralement transformation du code source en code exécutable dans une passe préfiliminaire à une exécution ultérieure, par opposition à du code interprété, donc en quelque sorte compilé au fur et à mesure de son exécution). ([EDIT]et puis il n'y a pas de script en Java, du moins pas encore; mais ça c'est une autre histoire). Elle concerne plutôt l'ordre d'exécution à priori.

    Ensuite, en Java, comme dans tous les langages structurés, le code s'exécute en séquence : il suffit donc de suivre les lignes une à une pour connaitre l'ordre d'exécution. La récursivité n'y change rien : simplement, on appelle la fonction dans elle-même. Le plus important étant d'avoir une condition d'arrêt qui n'appelle pas la fonction elle-même, afin de ne pas avoir un nombre infini d'appels récursifs, ce qui ferait que le programme ne s'arrête jamais (sauf si on le force, évidemment).

    1. On commence donc par exécuter if (c.suivant != null){ (je passe l'appel initial de la méthode)
    2. si la condition testée par ce if est vrai, alors on exécute la première ligne du bloc :
      1. soit int max = Maximum(c.suivant); donc on recommence, mais pour la valeur suivant c
      2. puis on exécute if(max < c.valeur)
      3. si la condition est vrai, on exécute max = c.valeur;,
      4. puisreturn c.valeur;

    3. sinon on exécute la première ligne du bloc du else
      1. soit return c.valeur;



    La logique qu'on cherche à implémenter dans l'algorithme est de dire que la valeur maximum d'une liste de valeurs, c'est la valeur la plus grande entre la première valeur de la liste et le maximum des autres valeurs (ou particulièrement pour une liste chainée, la valeur la plus grande entre la première valeur et la plus grande des valeurs qui suivent). La condition d'arrêt étant de dire le maximum d'une liste de une valeur c'est l'unique valeur elle-même.

    En gros :

    Code logique : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     max( valeur )  = valeur
    max( valeur1, valeur2, valeur3...valeurn ) = max ( valeur1, max( valeur2, valeur3...valeurn) )

    Soit, pour une liste chainé
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fonction max
    si valeur n'a pas de suivant
       valeurmax<- valeur
    sinon
       valeurmax= max( valeur, max ( suivant de valeur ) )
    fin si
    return valeurmax

    ou encore (en inversant pour être dans la logique du code que tu montres)
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    si valeur a un suivant
        truc = max  ( suivant de valeur )
        si truc plus grand que valeur 
            valeurmax = truc
        sinon 
            valeurmax = valeur
        finsi
    sinon
       valeurmax = valeur
    fin si
    return valeurmax

    Tu vois où je veux en venir ? [EDIT]Voir le message de @anapurna pour la réponse
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2015
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Je vous remercie pour vos rapides réponses,

    pardonnez moi en effet pour le côté "compilation", au lieu de l'ordre d'exécution.

    Flodelarab,
    Je faisait plutôt référence au second if, nous n'entrons pas dedans concernant l'appel de la méthode

    Anapurna,
    yes merci, c'est logique en effet

    Joel.drigo
    Merci beaucoup pour l'explication,
    j'avais essayé d'éxécuter le code sur papier sans voir l'évidence, mais oui !
    Une fois la dernière boucle de la méthode Maximum() effectuée par récursion, le max ne sera pas renvoyé en résultat final mais en résultat au
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int max = Maximum(c.suivant);
    ,

    Merci pour votre temps et bon code !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/03/2011, 18h30
  2. Réponses: 3
    Dernier message: 23/09/2010, 17h05
  3. select sur une liste chaînée
    Par wtfu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/06/2006, 15h30
  4. Réponses: 16
    Dernier message: 19/11/2005, 16h47
  5. Réponses: 15
    Dernier message: 01/11/2005, 13h32

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