Scheme: comment supprimer doublons dans une liste

Fermé
yrmab - 8 mai 2013 à 14:37
 remove_doubles - 5 juin 2013 à 17:03
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
8 mai 2013 à 14:42
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
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
8 mai 2013 à 15:12
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
J'ai fait ces test ils renvoient une erreur.

Effectivement il doit y avoir des différences...
0
remove_doubles
5 juin 2013 à 17:03
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