2016-09-29 3 views
0

私はサブリストを実装する必要がありますか?蓄積を使用する1ライナー関数として。 set1がset2であれば真を返すと仮定します。このようなサブリストを実装していますか?ラケットに蓄積を使用

何か:

(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

あなたが他の関数を使用することはできません:

だから、これはsubset?の可能な定義はありますか?あなたがいない場合、これは乱雑になります。もしそうなら、最初に、 'set1'の要素が' set2'のメンバであるかどうかを決めるブール値のリストを得る方法を考えてください。そのリストは簡単に蓄積されます。 – molbdnilo

答えて

0

まず、我々はどのように機能accumulate作品やそのパラメータの意味を理解しなければならないsubset?の正しい定義を与えるために。

我々は再帰的定義を「展開」した場合、我々はaccumulateリストlsの要素にfuncを適用したすべての結果にバイナリ演算子opを適用していることがわかります。そしてリストは空であることができるので、これらの場合、関数は値baseを返すように定義される。

それと同等であるのでそのため、例えば、関数の再帰的実行を想定し、以下の式

(accumulate + 0 sqr '(1 2 3)) 

は、14を生成する:

(+ (sqr 1) (+ (sqr 2) (+ (sqr 3) 0))) 

1 + 4 + 9であります+ 0

問題を解決するには、同じ演算子を要素のリストに適用するaccumulateへの呼び出しを定義し、nは結果を結合します。あなたの場合、適用される操作は、要素がリストのメンバ(member?)のメンバーであるかどうかのテストであり、set1のすべての要素に適用できます。そして、部分集合の定義から、s1のすべての要素がs2に含まれている場合に限り、集合s1は別の集合s2の部分集合であることを知るべきです。したがって、すべての結果を結合するために適用されなければならない演算子はand論理演算子なので、すべての要素がs2のメンバーであれば真となります。最後に決定するのは基本値です。空のセットは常に別のセットに含まれるため、これは真です。

(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

関連する問題