Methode recursive
Fermé
helloworld
-
3 mars 2018 à 11:01
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 4 mars 2018 à 13:21
KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 4 mars 2018 à 13:21
A voir également:
- Methode recursive
- Le client et le serveur ne sont pas compatibles avec une version de protocole ou une méthode de chiffrement ssl commune. ✓ - Forum Réseaux sociaux
- La méthode range de l'objet worksheet a échoué ✓ - Forum VB / VBA
- Methode lafay pdf - Forum Téléchargement
- Une référence d'objet est requise pour la propriété la méthode ou le champ non statique ✓ - Forum C#
- Méthode rose piano 3 année pdf gratuit - Forum Loisirs / Divertissements
1 réponse
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
3 mars 2018 à 12:54
3 mars 2018 à 12:54
Bonjour,
Tu manipules un type E, mais où est-il déclaré ? Parce que s'il est bien fait ça devrait être un paramètre de Liste et Node, or ici ce n'est pas le cas, donc c'est bizarre...
Remarque : pourquoi avoir fait Node une classe interne de Liste ? Dans ton code actuel ça ne se justifie pas.
Il vaudrait mieux soit la sortir de la classe, soit la déclarer static.
De plus, E est un objet, donc faire des comparaisons avec == est généralement faux, il faudrait plutôt utiliser la méthode equals de E, en vérifiant d'abord les cas où l'objet peut être null.
Quant à la récursivité, elle est effectivement mal utilisée car tu rappelles contains() sur le même objet, donc first reste le même d'un appel sur l'autre alors qu'il faudrait que tu te déplaces d'un Node à l'autre, donc la méthode contains serait plus pertinente sur la classe Node que sur la classe Liste.
Exemple (non testé)
Tu manipules un type E, mais où est-il déclaré ? Parce que s'il est bien fait ça devrait être un paramètre de Liste et Node, or ici ce n'est pas le cas, donc c'est bizarre...
Remarque : pourquoi avoir fait Node une classe interne de Liste ? Dans ton code actuel ça ne se justifie pas.
Il vaudrait mieux soit la sortir de la classe, soit la déclarer static.
De plus, E est un objet, donc faire des comparaisons avec == est généralement faux, il faudrait plutôt utiliser la méthode equals de E, en vérifiant d'abord les cas où l'objet peut être null.
Quant à la récursivité, elle est effectivement mal utilisée car tu rappelles contains() sur le même objet, donc first reste le même d'un appel sur l'autre alors qu'il faudrait que tu te déplaces d'un Node à l'autre, donc la méthode contains serait plus pertinente sur la classe Node que sur la classe Liste.
Exemple (non testé)
public class Liste<E> { private Node<E> first; public boolean contains(E value) { if (first == null) return false; return first.contains(value); } } class Node<E> { private E element; private Node<E> next; public boolean contains(E value) { if (element == null) return value == null; if (element.equals(value)) return true; if (next == null) return false; return next.contains(value); } }
4 mars 2018 à 11:03
4 mars 2018 à 13:21
Les seuls objets multiples sur lesquels on peut appliquer la récursivité ce sont les Node.
Concrètement, la vraie liste ce sont les objets Node connectés entre eux, qui contiennent les valeurs.
La classe Liste est un raccourci (très utile) vers le premier Node mais en réalité on pourrait s'en passer et ne travailler que sur les Node.
Exemple : je supprime la classe Liste et je renomme la classe Node en Liste2 (le code est le même)
C'est donc bien sur les Node (ou Liste2) qu'il faut mettre la récursivité.
La classe Liste est utile pour l’encapsulation des données afin d'éviter que l'utilisateur puisse modifier directement les Node, mais c'est juste une surcouche.
D'un point de vue algorithmique, tout repose sur les Node, donc c'est là que doit se trouver ton code.