Lisp 如何编写接受两个列表并返回四个列表的scheme函数
我有两个元素列表'(abc)'(dbf),希望在一个结果中找到差异、并集和交集。可能吗?怎么做 我编写了一个成员函数,检查第二个列表中是否有第一个列表中的汽车,但我不能将成员扔到新列表中Lisp 如何编写接受两个列表并返回四个列表的scheme函数,lisp,scheme,racket,Lisp,Scheme,Racket,我有两个元素列表'(abc)'(dbf),希望在一个结果中找到差异、并集和交集。可能吗?怎么做 我编写了一个成员函数,检查第二个列表中是否有第一个列表中的汽车,但我不能将成员扔到新列表中 (define (checkResult lis1 lis2) (cond........... )) (checkresult '( a b c) '(d b f)) 我的结果应该是((a c)(d f)(a b c d f)(b))确定这是可能的。以下是一些提示: 将一个列表和一个空列表组合起来的结
(define (checkResult lis1 lis2)
(cond...........
))
(checkresult '( a b c) '(d b f))
我的结果应该是
((a c)(d f)(a b c d f)(b))
确定这是可能的。以下是一些提示:
当然有可能。假设您有计算差异、并集交点等的函数:
(define (checkResult lis1 list2)
(list (difference lis1 lis2)
(union ...
在Charlie Martin和tomjen的答案之上,我找到了以下来源:
不同函数的实现可以通过很好的解释找到。正如其他人所说,您所需要做的就是创建单独的函数来计算两个集合的交集、并集和减法,并从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)))))
注意:因为这些是集合,顺序不重要,所以结果不排序。此外,这些函数假定输入是集合,因此不进行任何重复检查,超出union所需的检查。?如果是这样的话,你应该加上一个“家庭作业”标签。如果这是一个HW,这似乎是真的,很抱歉,如果我不应该透露一切,而只是提供提示和指导。这样做很有趣!我会回答任何我能回答的问题,包括家庭作业。确保学生不作弊不是我的工作。谢谢,我写了《交集》和《工会》,但我真的不知道如何打电话写一份新的名单,我知道了。谢谢……有一天,当这些人是你的同事时?这不是关于作弊,而是帮助人们接受如何解决问题的教育,而不只是要求你为他们解决问题。帮助他们学习和为他们编写代码一样有趣(而且更具挑战性)。只需回答一个“我应该如何思考”的问题,而不是一个“我应该键入什么?”的问题。例如,请看我对此解决方案的响应,它遇到了许多问题:Scheme有
成员
和memq
,equal?
检查通常更受期待,我们在cond
表达式中使用else
而不是#t
,相交
和相减
被过度复杂化,效率低下,最后——如果目标是返回四个结果,那么它们都可以在一个循环中计算。