Scheme: comment supprimer doublons dans une liste

yrmab -  
 remove_doubles -
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:

(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.

4 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Je ne pense pas que tu puisse utiliser equal? sur une liste.

    Tu devrais tester : (equal? (1 1) (1 1)) mais je pense que ça te renverra faux, ce qui expliquerait pourquoi il ne supprime pas les doublons vu qu'il ne sait pas que ça en est...
    0
  2. yrmab
     
    Merci de ta réponse rapide KX,

    equal? est valable pour les listes et je l'avais testé (equal? '(1 1) '(1 1)) renvoie true
    0
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    Ok, je n'ai pas Scheme sous la main, je testes donc avec du Common Lisp, c'est pour ça il peut y a voir des différences. Cependant, si tu testes avec ton apostrophe ça biaise les résultats, il faudrait tester sans les apostrophes comme je l'ai mis ou directement comme tu le fais dans ton code :

    (equal? (1 1) (1 1))

    ou

    (define test l (equal? (car l) (cadr l)))
    (test '((1 1) (1 1)))
    0
  4. yrmab
     
    J'ai fait ces test ils renvoient une erreur.

    Effectivement il doit y avoir des différences...
    0
    1. remove_doubles
       
      Salut

      (defun REMOVE_DOUBLES (lst)
      (cond
      ((null lst) nil)
      (T
      (cons (car lst) (REMOVE_DOUBLES (vl-remove (car lst) lst)))
      )
      )
      )

      (remove_doubles '(1 1 2 2 4 5 6 6)) --> (1 2 4 5 6)

      @+
      0