【发布时间】:2013-08-08 15:08:41
【问题描述】:
我正在使用 The little schemer 中的这个脚本来获取两组的交集。但我在“成员?”处收到未绑定标识符错误,谁能告诉它有什么问题:
(define intersect
(lambda (set1 set2)
(cond ((null? set1) (quote ()))
((member? (car set1) set2)
(cons (car setl)
(intersect (cdr set1) set2)))
(else (intersect (cdr setl) set2)))))
我在上面错过了这个功能:
(define member?
(lambda (a lat)
(cond ((null? lat) #f)
(else (or (eq? (car lat) a)
(member? a (cdr lat)))))))
另外,我想将两个列表相交,例如:'((1 2)(2 7))'((1 3)(4 5)) = '((1 5)),关于如何去的任何建议关于它?我正在从这篇文章中寻找答案:How to write a scheme function that takes two lists and returns four lists
【问题讨论】:
-
不清楚这两个列表如何“相交”以产生
'((1 5)) -
我正在考虑将第一个列表中每对的第一个元素与第二个列表中每对的第一个元素进行比较,然后在匹配发生时添加它们的第二个元素。 ://
-
您确信这种行为。 (1 5) 既不在第一个也不在第二个列表中..
(intersect '((1 2)(3 4)(5 6)) '((9 10) (7 8) (5 6))) ==> ((5 6))是正确理解交集和您的程序的行为。你的member?只需要使用equal?而不是eq?就可以了。 -
是的。我需要为列表中具有相同第一个元素的对添加 sec 元素,并相应地生成一个输出列表。
-
注意:该函数存在于列表SRFI库中:docs.racket-lang.org/srfi-std/srfi-1.html#lset-intersection。对于生产质量的集合交集,您可能希望使用专用集合数据类型而不是列表。 docs.racket-lang.org/reference/…
标签: list scheme racket intersection set