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

Scheme Discussion :

Supprimer les doublons d'une liste


Sujet :

Scheme

  1. #21
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut
    Salut,

    Alors moi je débute en scheme mais pour éliminer les doublons d'une liste déjà triée j'aurais fait quelque chose dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (define (doublons l)
      (cond ((null? (cdr l)) (car l))
    	((eq? (car l) (car (cdr l))) (doublons (cdr l)))
    	(else (append (list (car l)) (list (doublons (cdr l)))))))
    
    (define l (list 1 2 2 2 4 4 5))
    (display (doublons l))
    (newline)
    Alors par contre on ne peut pas envoyer de liste vide (réflexe du codage en C, je ne sais pas si en scheme on s'en préocupe ?). Mais à part ça ça fonctionne. Mais ça ne ressemble pas à ce que vous avez montré au-dessus.

    Je me trompe ou vous avez traité le cas général et c'est pour ça que je n'ai pas compris ?

    Merci.

  2. #22
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par sperca Voir le message
    Salut,

    Alors moi je débute en scheme mais pour éliminer les doublons d'une liste déjà triée j'aurais fait quelque chose dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (define (doublons l)
      (cond ((null? (cdr l)) (car l))
    	((eq? (car l) (car (cdr l))) (doublons (cdr l)))
    	(else (append (list (car l)) (list (doublons (cdr l)))))))
    
    (define l (list 1 2 2 2 4 4 5))
    (display (doublons l))
    (newline)
    Alors par contre on ne peut pas envoyer de liste vide (réflexe du codage en C, je ne sais pas si en scheme on s'en préocupe ?). Mais à part ça ça fonctionne. Mais ça ne ressemble pas à ce que vous avez montré au-dessus.

    Je me trompe ou vous avez traité le cas général et c'est pour ça que je n'ai pas compris ?

    Merci.
    Pour un débutant c'est pas mal.
    Les erreurs :
    • n'utilise pas (append (list x) y) mais (cons x y) ce qui est quand même plus simple;
    • il faut traiter le cas de la liste vide — une liste vide n'a pas de doublon et donc la valeur de retour est elle-même — ce qui se fait en ajoutant la clause (null? l)


    Finalement, KindPlayer traitait le cas général et non la suppression de « begaiement » qui est ce que demandait l'auteur du fil de discussion.

  3. #23
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par sperca Voir le message
    Salut,

    Alors moi je débute en scheme mais pour éliminer les doublons d'une liste déjà triée j'aurais fait quelque chose dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (define (doublons l)
      (cond ((null? (cdr l)) (car l))
    	((eq? (car l) (car (cdr l))) (doublons (cdr l)))
    	(else (append (list (car l)) (list (doublons (cdr l)))))))
    
    (define l (list 1 2 2 2 4 4 5))
    (display (doublons l))
    (newline)
    Alors par contre on ne peut pas envoyer de liste vide (réflexe du codage en C, je ne sais pas si en scheme on s'en préocupe ?). Mais à part ça ça fonctionne. Mais ça ne ressemble pas à ce que vous avez montré au-dessus.

    Je me trompe ou vous avez traité le cas général et c'est pour ça que je n'ai pas compris ?
    Tu as tout à fait raison, KindPlayer avait lu le problème en diagonal et a donc proposé une solution pour une liste quelconque qui a été discutée et améliorée.

    Ta proposition est très bien, en dehors du fait qu'elle ne prend pas en compte le cas de la liste vide et que tu ne sembles pas connaître cons :
    Code Scheme : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (define (doublons l)
      (cond [{or (null? l) (null? (cdr l))} l]
    	[{eq? (car l) (cadr l)} (doublons (cdr l))]
    	[else (cons (car l) (doublons (cdr l)))]
            )
      )

    --
    Jedaï

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut
    Oui avec cons la solution est plus simple.

    Merci ;-)

Discussions similaires

  1. Réponses: 16
    Dernier message: 03/06/2014, 07h39
  2. Supprimer les doublons d'une liste déroulante
    Par zanzie dans le forum Flash
    Réponses: 1
    Dernier message: 11/04/2011, 08h34
  3. Supprimer les doublons dans une liste
    Par inforum dans le forum SL & STL
    Réponses: 2
    Dernier message: 22/11/2009, 15h21
  4. [E-03] Supprimer les doublons d'une liste
    Par Loki83 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/12/2008, 16h34
  5. Réponses: 10
    Dernier message: 19/09/2006, 03h15

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