实现子列表?使用累积在球拍
我需要实现子列表?作为使用累积的单线程函数。 如果set1在set2中,则返回true。实现子列表?使用累积在球拍
事情是这样的:
(define subset?
(lambda (set1 set2)
(accumulate member? (car set1) (lambda (x) x) set2)))
老实说,我觉得我在累积是如何想与成员的工作只是困惑,或者如果成员甚至对操作者的正确选择。
我的累加功能是:
(define accumulate
(lambda (op base func ls)
(if (null? ls)
base
(op (func (car ls))
(accumulate op base func (cdr ls))))))
和成员?:
(define member?
(lambda (item ls)
(cond ((null? ls) #f)
((equal? item (car ls)) #t)
(else (member? item (cdr ls))))))
举的subset?
正确的定义首先,我们必须了解的功能accumulate
作品及其参数的意义如何。
如果我们“展开”递归定义,我们可以看到,accumulate
应用二进制运算符op
施加func
到列表ls
的元素的所有结果。由于列表可以是空的,在这些情况下,函数被定义为返回值base
。
所以,举例来说,假设函数的递归执行,下面的表达式
(accumulate + 0 sqr '(1 2 3))
产生14,因为它是等效于:
(+ (sqr 1) (+ (sqr 2) (+ (sqr 3) 0)))
即1 + 4 + 9 + 0.
要解决您的问题,您必须定义一个调用accumulate
,该调用将相同的运算符应用于元素列表,并将结合了。在你的情况下,要应用的操作是测试一个元素是否为列表的成员(member?
),并且可以将其应用于所有元素set1
。根据子集的定义,您应该知道,当且仅当s1的所有元素都包含在s2中时,集合s1是另一个集合s2的子集。因此,必须应用的运算符将所有测试结果合并为and
布尔运算符,因此,如果s1的元素是s2的成员,则其为全部,否则为true。最后要决定的是基本值:这应该是真实的,因为空集合总是包含在另一个集合中。
所以这是subset?
一个可能的定义:
(define (subset? set1 set2)
(accumulate
(lambda (x y) (and x y)) ;; the combination operator
#t ;; the value for the empty list
(lambda(x) (member x set2)) ;; the function to be applied to all the elements of
set1)) ;; the set set1
非常感谢您的详细解释。现在它变得更有意义。 – Funnel
难道你不允许使用任何其他的功能呢?如果不是,这会变得混乱。如果你是,首先找出一种方法,你可以得到一个布尔值列表,确定'set1'的元素是否是'set2'的成员。该清单很容易积累。 – molbdnilo