2017-12-20 28 views
1

두 개의리스트, lst1lst2이 있습니다. 일부 요소를 공유하는지 확인하는 함수를 정의하려고합니다. 예를 들어 :리스트가 라켓에서 하나 이상의 요소를 공유하는지 확인

  • (share-some-elements? '(a b) '(a c)) ⇒ 사실
  • (share-some-elements? '(a b) '(d e f)) ⇒ 거짓
  • (share-some-elements? '(a b) '(a b d e)) ⇒는

내가 구현이 true를 확인

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

lst2의 각 요소 인 경우 lst1의 회원 , 그 중 하나가 true이면 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)) ⇒ 사실

파이썬에서 두 목록에이 작업을 수행하는 방법에 대한 비슷한 질문이있다 : Checking if two lists share at least one element를, 아무튼 내 질문에 꽤 답할 수 없다.

+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을 적용합니다.
  • 결과가 공백이 아닌 경우 목록은 적어도 하나의 공통 요소를 공유합니다.

사용하여 예 :

(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'가 일반 목록에서 작동한다는 것을 몰랐다. 이제 해결되었습니다 :) –