Scheme: comment supprimer doublons dans une liste
yrmab
-
remove_doubles -
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.
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
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...
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...
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
equal? est valable pour les listes et je l'avais testé (equal? '(1 1) '(1 1)) renvoie true
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)))
(equal? (1 1) (1 1))
ou
(define test l (equal? (car l) (cadr l)))
(test '((1 1) (1 1)))