2011-04-07 4 views
0

나는 C# 클래스 MyClass 있습니다.F # 모든 순열의 C# 클래스

그리고 나는 IList의

문제에 모든 항목 가능한 순열을 반환 f를 # 메서드를 구현해야는 MyClass에이 방법 부울 CheckOrder을 (IList의 전임자) MyClass에의 인스턴스가 될 수있는 경우에 true를 돌려 포함되어 있다는 것입니다 매개 변수에 MyClass 인스턴스 이있는 순열에 배치됩니다. 그 외는,이 메소드는 false를 돌려줍니다.

적절한 F # 기능을 구현하는 방법을 알려주시겠습니까?

업데이트 : , 당신은 내 C# 클래스를 갖는 방법을 고려하는 방법 테스트의 F # 코드를 간략하게 설명 할 수주십시오 부울 CheckOrder (IList의 전임자)

+0

관심 대상 일 수 있습니다. http://stackoverflow.com/questions/286427/calculating-permutations-in-f; http://stackoverflow.com/questions/1526046/f-permutations – Daniel

+0

다른 하나 : http://stackoverflow.com/q/4495597/ – ildjarn

+1

이 인터페이스를 사용하여 유일한 솔루션은 "생성 및 테스트", 즉 만드는 것 같습니다. 모든 순열을 제거한 다음 필터링하십시오. 이것은 큰 목록에 대해서는 비실용적입니다. 주문 제약 조건을보다 명확하게 나타내면 예약 및 제약 프로그래밍의 기술을 사용하여 효율적인 구현이 가능해야합니다. Microsoft Solver Foundation을 살펴보십시오. – wmeyer

답변

0

당신의 CheckOrder 방법은 IList<MyClass> 기대를, 그래서 우리는 어쩌면 함께 작동합니다 배열은 IList 인터페이스를 구현하기 때문에 F #의 배열을 사용합니다.

순열 후보의 모든 요소에 대해 배열의 모든 선행자가 합법적인지 여부를 확인해야합니다. 나에게 그것은 fold 연산을위한 작업처럼 보입니다. 여기서 fold의 상태 매개 변수는 "지금까지의 배열"과 부울 성공 플래그의 튜플입니다.

let checkPermutation (permutation:MyClass[]) = 
    let prefix, success = 
     permutation 
     |> Array.fold (fun (prefix:MyClass[], success) element -> 
         if not success then 
          (Array.empty, false) // once failed, the result is false 
         else 
          (Array.append [|element|] prefix, element.CheckOrder prefix) 
        ) 
        (Array.empty, true) 
    success 

Array.append은 아마도 매우 비효율적입니다. 너무 느리다면 ResizeArray (C# List과 동일)을 사용하는 것이 좋습니다.