首页 > 解决方案 > 如何在 Racket 中获取此代码以仅返回非重复项目?

问题描述

代码是这样工作的,我传递了几个列表,它只返回一个列表。我想要它做的是在加入列表中的元素后,它会删除重复的元素。为了更清楚:

代码是这样工作的:

> (koo '(p x k c l) '(l x y c) '(x k))
'(p x k c l l x y c x k)

我希望他像这样回到我身边:

> (koo  '(p x k c l) '(l x y c) '(x k))
'(p y )

这里的代码:

(define (koo  . c)
   (if (null? c)
       empty
       (concatenate1 (first c)
                    (apply xor* (rest c)))))

(define (concatenate1 l1 l2)
   (if (null? l1)
       l2
       (cons (first l1) (concatenate1 (rest l1) l2))))

标签: schemeracket

解决方案


仅使用基本racket功能的效率不高的版本:

(define (unique-elements lst)
   (let ((dup (check-duplicates lst)))
        (if dup
            (unique-elements (remove* (list dup) lst))
            lst)))

(define (xor* . lol) (unique-elements (append* lol)))

查找第一个重复元素,如果有,则从列表中删除该元素的所有实例,并重复直到没有重复元素。


推荐阅读