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

3 lisp scheme racket

我有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的要求的重复检查.

  • 这很有趣!我会回答任何问题,包括家庭作业.确保学生不作弊不是我的工作. (6认同)
  • 有一天,当这些人是你的同事?这不是关于作弊,而是关于帮助人们接受如何解决问题的教育而不仅仅是要求你为他们做这件事.帮助他们学习和为他们编码一样有趣(而且它更具挑战性).只需回答它为"我该怎么想?" 问题而不是"我应该输入什么?" 题.例如,看到我来http://stackoverflow.com/questions/623435/project-euler-problem-233/641635#641635响应 (2认同)