2016-09-29 32 views
0

我需要實現子列表?作爲使用累積的單線程函數。 如果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

回答

0

舉的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