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 doublons dans une liste


Sujet :

Scheme

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Supprimer doublons dans une liste
    Bonjour,
    Je souhaite créer une fonction qui supprime les doublons dans une liste.

    par ex: (doublons '(1 1 2 2 4 5)) --> (1 2 4 5)

    Voici mon code:

    Code : 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)
    	((equal? (car l) (cadr l)) (doublons (cdr l)))
    	(else (cons (car l) (doublons (cdr l))))
            )
      )
    Il fonctionne lorsque les éléments de la liste sont des nombres.
    En revanche il ne fonctionne pas pour des éléments autre que des nombres,

    (doublons '((1 1) (1 2) (1 1))) renvoie ((1 1) (1 2) (1 1))

    Comment surmonter ce problème, j'ai passé énormement de temps dessus et reste bloqué.

    Merci d'avance.

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Bonjour.

    En effet, ça ne marche pas pour les nombres non plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > (doublons '(1 2 1))
    '(1 2 1)
    C'est l'algorithme qui en est coupable.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Bonjour
    Il me semble que le plus simple est de créer une fonction secondaire avec une liste (vide au départ) qui se remplit avec les éléments qui ne sont pas dajà présents dans cette liste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (define (doublons l)
        (doublons_helper(l '()))
    doublons_helper renvoyant son second argument lorsque le premier est vide.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Ou bien la même récursion terminale sous forme d'un « named let ».

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Par exemple.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #lang racket
    (define (remove-duplicates lst)
      (let loop ([curr-lst lst]
                 [acc null])
        (if (null? curr-lst)
            (reverse acc)
            (let ([head (car curr-lst)])
              (loop (cdr curr-lst)
                    (if (member head acc)
                        acc
                        (cons head acc)))))))

    L'idée est la même, c'est seulement la forme qui diffère.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je n'aime pas beaucoup l'itératif en Scheme, le récursif et plus sympa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (define (doublons l)
      (let doublons_helper ([lst l]
                            [rest '()])
        (cond ((null? lst) (reverse rest))
              ((member (car lst) rest) (doublons_helper (cdr lst) rest))
              (else (doublons_helper (cdr lst) (cons (car lst) rest))))))
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par Trap D Voir le message
    Je n'aime pas beaucoup l'itératif en Scheme, le récursif et plus sympa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (define (doublons l)
      (let doublons-helper ([lst l]
                            [rest '()])
        (cond ((null? lst) (reverse rest))
              ((member (car lst) rest) (doublons-helper (cdr lst) rest))
              (else (doublons-helper (cdr lst) (cons (car lst) rest))))))
    Donc c'est le même « named let » que tu as nommé « doublons-helper » alors que je l'ai nommé « loop » (ce terme n'a ici aucune signification spéciale). Avec une vraie fonction auxilière ça serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (define (doublons l)
      (letrec ([doublons-helper (lambda (lst rest)
                                  (cond ((null? lst) (reverse rest))
                                        ((member (car lst) rest) (doublons-helper (cdr lst) rest))
                                        (else (doublons-helper (cdr lst) (cons (car lst) rest)))))])
        (doublons-helper l '())))
    (define (doublons* l)
      (define (doublons-helper lst rest)
        (cond ((null? lst) (reverse rest))
              ((member (car lst) rest) (doublons-helper (cdr lst) rest))
              (else (doublons-helper (cdr lst) (cons (car lst) rest)))))
      (doublons-helper l '()))

Discussions similaires

  1. [C# 2.0] Détecter les doublons dans une List<string>
    Par Rodie dans le forum Windows Forms
    Réponses: 36
    Dernier message: 30/03/2013, 15h21
  2. Supprimer les doublons dans une liste
    Par inforum dans le forum SL & STL
    Réponses: 2
    Dernier message: 22/11/2009, 15h21
  3. [MySQL] Supprimer doublon dans une liste
    Par Gad29 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 14h13
  4. Réponses: 13
    Dernier message: 01/08/2006, 16h59
  5. [Oracle] Doublon dans une liste
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 9
    Dernier message: 09/06/2006, 16h09

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