2017-12-20 36 views
1

私はlst1lst2という2つのリストを持っています。彼らがいくつかの要素を共有しているかどうかをチェックする関数を定義したいと思います。たとえば、次のようにリストがラケットの1つ以上の要素を共有しているかどうかをチェック

  • (share-some-elements? '(a b) '(a c))⇒真
  • (share-some-elements? '(a b) '(d e f))⇒偽
  • (share-some-elements? '(a b) '(a b d e))⇒真

私は実装があります

(define (share-some-elements? lst1 lst2) 
    (ormap (λ (x) (member x lst1)) lst2)) 

lst2の各要素があるかどうかをチェックしますlst1のメンバーそれらのいずれかが存在する場合はtrueを返します。

私の質問は以下のとおりです。

  1. これを行うための他の方法は何ですか?
  2. これを拡張して、任意の数のリストをサポートするにはどうすればよいですか?すなわち、
    • (all-share-some-elements? '(a b) '(a c) '(a d))

⇒真

  • (all-share-some-elements? '(a b) '(a c) '(b d))⇒偽
  • (all-share-some-elements? '(a b) '(a c) '(b d a))⇒pythonで二つのリストにこれを行う方法で同様の問題があります: Checking if two lists share at least one element、doesnの私の質問には全く答えられません。

  • +2

    [設定-交差点を](http://docs.racket-lang.org/reference/sets.html#%28def._%28% 28lib._racket%2Fset..rkt%29._set-intersect%29%29)、複数のリストで動作します。交差点が空でない場合は、共通の要素があります。 – Renzo

    答えて

    1

    両方の質問は、可変数の引数を取る単一のプロシージャを使用して解決できます。少なくとも一つのリストが渡されると仮定すると、我々が持っている:

    (define (all-share-some-elements? . lists) 
        (not (null? (apply set-intersect lists)))) 
    

    説明:

    • 我々は、すべてのリストにset-intersectを適用します。
    • 交差の後に結果が空でない場合、リストは少なくとも1つの要素を共有します。あなたの例を使用して

    あなたが使用することができ
    (all-share-some-elements? '(a b) '(a c)) 
    => #t 
    (all-share-some-elements? '(a b) '(d e f)) 
    => #f 
    (all-share-some-elements? '(a b) '(a b d e)) 
    => #t 
    
    (all-share-some-elements? '(a b) '(a c) '(a d)) 
    => #t 
    (all-share-some-elements? '(a b) '(a c) '(b d)) 
    => #f 
    (all-share-some-elements? '(a b) '(a c) '(b d a)) 
    => #t 
    
    +1

    '(not?null?(set-intersectリストを適用します)))'? – uselpa

    +1

    @uselpa何もない、ちょうど私は 'set-intersect'が普通のリストで働いていることに気づいていませんでした。それは今修正されました:) –

    関連する問題