如何编写一个带有两个列表并返回四个列表的scheme函数

时间:2009-04-19 14:22:59

标签: lisp scheme racket

我有2个元素列表'(a b c)'(d b f),想要在一个结果中找到差异,联合和交集。那可能吗?怎么样?

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

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

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

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

4 个答案:

答案 0 :(得分: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)))))

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

答案 1 :(得分:3)

当然有可能。假设你有计算差异的函数,联合交集等:

 (define (checkResult lis1 list2)
   (list (difference lis1 lis2)
        (union ...

答案 2 :(得分:2)

当然有可能。以下是一些提示:

  1. 组合列表和空列表的结果是什么?
  2. 您不必一次完成所有操作。一次拿一块。

答案 3 :(得分:1)

除了查理·马丁和tomjen的答案之外,我已经提出了这个来源:

Union Intersection and Difference

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