Lisp 如何编写接受两个列表并返回四个列表的scheme函数

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))确定这是可能的。以下是一些提示: 将一个列表和一个空列表组合起来的结

我有两个元素列表'(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 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
    相交
    相减
    被过度复杂化,效率低下,最后——如果目标是返回四个结果,那么它们都可以在一个循环中计算。