2012-11-26 2 views
4

두 목록 간의 교차를 가져와 새 목록을 만드는 함수를 찾고 있는데,이 함수는 다음과 같습니다. let intersect x y = Set.intersect (Set.ofList x) (Set.ofList y) 그 중 개미는 수행하지만 inbuilt 함수를 사용하고 싶지는 않습니다. F #을두 개의 목록 사이의 교차 F #

+0

inbuilt 물건을 사용하는 것이 정확히 잘못되었습니다 - 직접 쓰는 것보다 훨씬 낫습니다. 또한 쓰는 것은 무엇이든 그것을 복제하려고 시도하는 것입니다. –

+2

목록의 순서를 무시하면 세트가 아닌 멀티 세트로 볼 수 있습니다. 목록에 여러 번 나타나는 요소로 무엇을하고 싶습니까? – Joh

답변

5

이 라이브러리의 재료를 사용하는 것이 가장 좋은 방법입니다,하지만 당신은

우리가 입력 목록 정렬되어 있다고 가정 할 수없는 경우 경우 (List.sort를 사용하거나 직접 작성) :

let rec intersect a b = 
    match a with 
    |h::t -> match b with 
      |h2::t2 -> 
       if h=h2 then h::(intersect t t2) 
       else if h>h2 then intersect t b else intersect a t2 
      |[] -> [] 
    |[] -> [] 
+0

"병렬"일치를 사용하여 개선 될 수 있습니까? 즉, 한 번에 a와 b 모두에 일치합니까? – Joh

+0

이 코드를 테스트했는데 작동하지 않습니다 – user1838768

+1

@ user1838768 : 정렬 목록으로 테스트 했습니까? – pad

4

I을 목록을 집합으로 변환하는 것이 이 경우에 좋은.

open System.Linq 

let intersect (xs:'a seq) (ys: 'a seq) = xs.Intersect(ys) 

당신은 FSharpList하여이 함수를 호출 할 수 있습니다 : 여기

는 세트 변환없이 작동하지만 붙박이 Enumerable.Intersect 기능을 사용하는 다른 대안입니다.