3

我有 2 个元素列表 '(abc) '(dbf) 并希望在一个结果中找到差异、联合和交集。那可能吗?如何?

我写了一个成员函数来检查第二个列表中是否有第一个列表的汽车,但是我不能将成员扔到新列表中。

(define (checkResult lis1 lis2)
  (cond...........

))
(checkresult '( a b c) '(d b f))

我的结果应该是(( a c) (d f) (a b c d f) (b))

4

4 回答 4

10

正如其他人所说,您需要做的就是创建单独的函数来计算两个集合的交集、并集和减法,并从 checkresult 中调用它们:

(define (checkresult a b)
  (list (subtract a b)
        (subtract b a)
        (union a b)
        (intersect a b)))

以下是一些示例并集、交集和减法函数:

(define (element? x lst)
  (cond ((null? lst) #f)
        ((eq? x (car lst)) #t)
        (#t (element? x (cdr lst)))))

(define (union a b)
  (cond ((null? b) a)
        ((element? (car b) a)
         (union a (cdr b)))
        (#t (union (cons (car b) a) (cdr b)))))

(define (intersect a b)
  (if (null? a) '()
      (let ((included (element? (car a) b)))
        (if (null? (cdr a))
            (if included a '())
            (if included
                (cons (car a) (intersect (cdr a) b))
                (intersect (cdr a) b))))))

(define (subtract a b)
  (cond ((null? a) '())
        ((element? (car a) b)
         (subtract (cdr a) b))
        (#t (cons (car a) (subtract (cdr a) b)))))

注意:由于这些是集合并且顺序无关紧要,因此结果没有排序。此外,这些函数假定输入是集合,因此除了联合所需的内容之外,不会进行任何重复检查。

于 2009-04-19T15:19:33.837 回答
3

当然有可能。假设您具有计算差异、联合交集等功能:

 (define (checkResult lis1 list2)
   (list (difference lis1 lis2)
        (union ...
于 2009-04-19T14:32:47.943 回答
2

当然有可能。这里有几个提示:

  1. 组合列表和空列表的结果是什么?
  2. 您不必一次完成所有操作。一次取一块。
于 2009-04-19T14:32:16.323 回答
1

在查理马丁和汤姆詹的回答之上,我想出了这个来源:

联合交点和差异

可以通过很好的解释找到不同功能的实现。

于 2009-04-19T14:41:03.367 回答