Я бы подошел к этому, выполнив цикл со вторым списком, который вы строите из видимых элементов.Мне будет жаль давать вам это, если это домашнее задание - важнее понять, как работает рекурсия, чем просто иметь правильный ответ.
(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)))))))