实现子列表?使用累积在球拍

问题描述:

我需要实现子列表?作为使用累积的单线程函数。 如果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)))))) 
+0

难道你不允许使用任何其他的功能呢?如果不是,这会变得混乱。如果你是,首先找出一种方法,你可以得到一个布尔值列表,确定'set1'的元素是否是'set2'的成员。该清单很容易积累。 – molbdnilo

举的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 
+0

非常感谢您的详细解释。现在它变得更有意义。 – Funnel