Как стереть все повторяющиеся элементы в схеме списка? - PullRequest
1 голос
/ 21 апреля 2011

Моя попытка была,

(define (remove-dup lst)
  (cond ((null? lst) '())
        ((null? (cdr lst)) (car lst))
        ((equal? (car lst) (car (cdr lst))) (remove-dup (cdr lst)))
        (else (cons (car lst) (remove-dup (cdr lst))))
        )

  )

Мой список был (a b c a a c c c ) Что я хочу, это (a b c).Любая идея?

Спасибо,

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

R5RS + SRFI1

(define (remove-duplicates lst)
    (fold-right (lambda (f r)
             (cons f (filter (lambda (x) (not (equal? x f))) r))) '() lst))
2 голосов
/ 21 апреля 2011

Я бы подошел к этому, выполнив цикл со вторым списком, который вы строите из видимых элементов.Мне будет жаль давать вам это, если это домашнее задание - важнее понять, как работает рекурсия, чем просто иметь правильный ответ.

(define (remove-dup ls)
  (let loop ((ls ls) (seen '()))
     (cond
       ((null? ls) '())
       ((memq (car ls) seen) (loop (cdr ls) seen))
       (else (cons (car ls) (loop (cdr ls) (cons (car ls) seen))))))

Обновлен для соответствияВаши комментарии - это, вероятно, не самое чистое решение, но оно должно дать вам представление о том, как оно может работать.

(define (rdup ls)
  (let loop ((ls ls) (current #f)) ; this is bad coding style, a "magic" variable you don't expect to see in your list
     (cond
       ((null? ls) '())
       ((null? (cdr ls)) (if (eq? (car ls) current) '() ls))
       ((eq? (car ls) (cadr ls)) (loop (cdr ls) (car ls)))
       ((eq? (car ls) current) (loop (cdr ls) current))
       (else (cons (car ls) (loop (cdr ls) (car ls)))))))
0 голосов
/ 09 ноября 2014

Используя SRFI 1, вы можете использовать напрямую delete-duplicates или delete-duplicates!: http://srfi.schemers.org/srfi-1/srfi-1.html#delete-duplicates

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...