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

avec Java Discussion :

Problème de max dans liste chainée


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    bordeaux
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : bordeaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Par défaut Problème de max dans liste chainée
    Bonjour a tous,

    j'ai un soucis dans ma fonction maximum. Le prof nous a imposé de la faire de façon récursive. Quand je compile, j'ai seulement les deux premiers qui sont bien passé dans ma condition mais je n'arrive pas a accéder à la cellule suivante. J'ai du mal sur les fonctions récursive. Est-ce que quelqu'un pourrait m'aider à y voir plus clair.

    voici mon 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
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
     
    public class Cellule {
    	int valeur;
    	Cellule suivant;
     
    	Cellule(int pvaleur) {
    		valeur = pvaleur;
    		suivant = null;
    	}
     
    }
     
    import java.util.Random;
     
    public class ListeChainee {
    	Cellule tete;
     
    	ListeChainee() {
    		tete = null;
    	}
     
    	public void Afficher() {
    		Cellule c = tete;
    		while (c != null) {
    			System.out.print(c.valeur + " ");
    			c = c.suivant;
    		}
    	}
     
    	public void Ajouter(int valeur) {
    		Cellule nc = new Cellule(valeur);
     
    		nc.suivant = tete;
    		tete = nc;
    	}
     
    	public void Init(int n) {
    		Random rand = new Random();
    		for (int i = 0; i < n; i++) {
    			this.Ajouter(rand.nextInt(1000));
     
     
    		}
    	}
     
    	public int Minimum() {
    		int valMin = 10000;
    		Cellule c = tete;
    		while (c != null) {
     
    			if (c.valeur < valMin) { 										
    				valMin = c.valeur;
     
    			}
    			c = c.suivant;
    		}
     
    		System.out.print(" la valeur minimum est : " + valMin);
     
    		return valMin;
    	}
     
    	static int Maximum(Cellule c) {
    		int max = c.valeur;
    		if (c != null) {
    			if (c.valeur < c.suivant.valeur) {
    				max = c.suivant.valeur;
    				max = ListeChainee.Maximum(c.suivant);
    			}
    		}
    		return max;
    	}
     
    	void Supprimer(int n) {
    		ListeChainee l = new ListeChainee();
    		Cellule c = tete;
    		while (c != null) {
    			if (c.valeur != n) {
     
    				l.Ajouter(c.valeur);
    			}
    			c = c.suivant;// on passe à la cellule suivante
    		}
     
    		System.out.println(" La nouvelle liste est : ");
     
    		l.Afficher();
     
    	}
    }
    import java.util.Scanner;
     
     
    public class test {
     
     
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		System.out.print(" Début liste chainée : ");
    	ListeChainee l1 = new ListeChainee();
    	l1.Init(10);
    	l1.Afficher();
    	l1.Minimum();
    	Cellule c2=new Cellule (0);
    	c2. suivant=l1.tete;
    	l1.tete = c2;
    	 System.out.println(" le chiffre maximum de la liste est : " + 
    	ListeChainee.Maximum(c2)); 
           System.out.print(" Deuxième liste chainée : ");
    	ListeChainee l2 = new ListeChainee ();
    	for (int i = 0; i < 10; i++) {
    		l2.Ajouter(i);
    	}
    	l2.Afficher();
    	l2.Supprimer(2);
    	}
     
    }

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    salut
    voici le code de maximum:
    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
    public static int Maximum(Cellule c) {
    		int max = c.valeur;
    		while (c != null) {
    			 
    			if (c.valeur > max) { 										
    				max = c.valeur;
     
    			}
    			c = c.suivant;
    		}
     
    		System.out.print(" la valeur Maximun est : " + max);
     
    		return max;
    	}
    Eric

  3. #3
    Membre averti
    Femme Profil pro
    bordeaux
    Inscrit en
    Novembre 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : bordeaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2012
    Messages : 22
    Par défaut
    merci mais la méthode doit impérativement être récursive

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    En gros, le max d'une liste, c'est le max entre le premier et le max du reste de la liste, et comme le max du reste de la liste, c'est le max entre premier du reste de la liste, et le max entre ce qu'il y ensuite... etc...

    Pour l'écrire de façon récursive, il suffit de prendre pour forme générale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    max( cellule ) 
    si suivante de cellule existe ,  return la cellule avec la plus grande valeur entre cellule et max ( de sa suivante )
    sinon return cellule
    autrement dit, en Java, par exemple :

    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 Cellule max(Cellule cellule) {
       if ( cellule.suivante!=null ) {
     
          Cellule celluleMax = max( cellule.suivante );
     
          if( celluleMax.value>cellule.value ) {
             return celluleMax;
          }
          else {
             return cellule;
          }
     
       }
       else {
           return cellule;
       }
    }
    qu'on peut simplifier en (en perdant un peu de sémantique) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public Cellule max(Cellule cellule) {
       if ( cellule.suivante!=null ) {
     
          Cellule celluleMax = max( cellule.suivante );
     
          if( celluleMax.value>cellule.value ) {
             return celluleMax;
          }
     
       }
       return cellule;
    }
    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 Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    ou encore:
    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
     
    public static int maximumRecursive(Cellule c, Integer max, boolean debut) {
     
    		if(c != null)
    		{
    		  if(debut) 
    		  {
    			  max = c.valeur;
    			 return maximumRecursive(c, max, false);
    		  }
    		  else
    		  {
    			  if(c.suivant != null)
    			  {
    				  if (c.suivant.valeur > max) { 										
    						max = c.suivant.valeur;
    					}
    				  return maximumRecursive(c.suivant, max, false);  
    			  }
    			  else
    				  return max;
    		  }
     
    		}
    		else
    		{
    		return max;
    		}
    	}
    et dans la main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    max =  ListeChainee.maximumRecursive(c2, -1, true);

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ouaip enfin le principe du récursif, au départ, c'est qu'on n'a pas besoin de tous ces paramètres.
    Coller au plus proche de la définition récursive mathématique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    Oui je comprend.

    Eric

Discussions similaires

  1. [WSS?] Problème HTTPS répertoires dans listes
    Par srouquet dans le forum SharePoint
    Réponses: 2
    Dernier message: 02/04/2009, 15h45
  2. Réponses: 3
    Dernier message: 07/03/2009, 14h44
  3. [XSL] Problème d'echappement dans une chaine de caractère
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 03/03/2009, 09h49
  4. Problème constructeur par copie listes chainées
    Par Nicoclem dans le forum C++
    Réponses: 4
    Dernier message: 10/04/2008, 11h44
  5. problème d'accent dans une chaine
    Par dom_dev dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 10h33

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