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

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   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
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
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   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
yrmab
 
J'ai fait ces test ils renvoient une erreur.

Effectivement il doit y avoir des différences...
0
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