我有2个元素列表'(abc)'(dbf),并希望在一个结果中找到差异,联合和交集.那可能吗?怎么样?
我写了一个成员函数,检查第二个列表中是否有第一个列表的汽车,但我不能将成员扔到新列表中.
(define (checkResult lis1 lis2)
(cond...........
))
(checkresult '( a b c) '(d b f))
Run Code Online (Sandbox Code Playgroud)
我的结果应该是(( a c) (d f) (a b c d f) (b)).
Kyl*_*nin 10
像其他人所说的那样,你需要做的就是创建单独的函数来计算两组的交集,并集和减法,并从checkresult中调用它们:
(define (checkresult a b)
(list (subtract a b)
(subtract b a)
(union a b)
(intersect a b)))
Run Code Online (Sandbox Code Playgroud)
以下是一些示例联合,交集和减法函数:
(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)))))
Run Code Online (Sandbox Code Playgroud)
注意:由于这些是集合并且顺序无关紧要,因此结果不会排序.此外,函数假定输入是集合,因此不会进行任何超出union的要求的重复检查.