【问题标题】:How to write a scheme function that takes two lists and returns four lists如何编写一个接受两个列表并返回四个列表的方案函数
【发布时间】:2010-10-20 09:52:56
【问题描述】:

我有 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))

【问题讨论】:

  • 家庭作业?如果是这样,您应该添加一个“家庭作业”标签。

标签: lisp scheme racket


【解决方案1】:

正如其他人所说,您需要做的就是创建单独的函数来计算两个集合的交集、并集和减法,并从 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)))))

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

【讨论】:

  • 这很有趣!我会回答我能回答的任何问题,包括家庭作业。确保学生不作弊不是我的工作。
  • 谢谢我写了 intersect 和 union 但我真的不知道如何调用和写一个新列表我明白了谢谢..
  • 有一天,当这些人成为你的同事时?这不是作弊,而是帮助人们接受如何解决问题的教育,而不仅仅是要求你为他们做这件事。帮助他们学习和为他们编写代码一样有趣(而且它更多具有挑战性)。只需将其回答为“我应该如何思考?”问题而不是“我应该输入什么?”题。例如,看我对stackoverflow.com/questions/623435/project-euler-problem-233/…的回复
  • 这个解决方案有很多问题:Scheme 有membermemqequal? 检查通常更值得期待,我们在cond 表达式中使用else 而不是#t , intersectsubtract 过于复杂且效率低下,最后——如果目标是返回四个结果,那么它们都可以在一个循环中计算。
【解决方案2】:

当然可以。假设您具有计算差异、联合交集等功能:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在 Charlie Martin 和 tomjen 的回答之上,我想出了这个来源:

      Union Intersection and Difference

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

      【讨论】:

      • 如果这是一个硬件,看起来确实如此,对不起,如果我不应该透露所有内容而只提供提示和指导。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多