2017-12-31 18 views
3

SML에서 k-out-of-N을 구현하려고 했으므로 "pick (3, [1,2,3,4])"는 [[1,2,3 ], [1,3,4] ...] (N 개의 모든 K 크기 선택)K 구현 on N 구현 - SML

나는 List.map을 사용하여 함수를 호출하고 각 요소에 적용한다고 생각했습니다.

실제로 "pick (3, [1,2,3,4,5])"입력을 입력 할 때 왜 빈 목록을 반환하는지 알 수 없습니다.

첫 번째 생각은 초기 조건 (choose (_, []) = [])으로 인한 것입니다. 하지만 변경하는 것도 효과가 없었습니다.

서명이 괜찮습니다 (val pick = fn : int * '목록 ->'목록 목록). 기본 케이스는 그들이 항상 빈리스트를 생산한다는 점에서 정확하고 빈리스트 상에 매핑 fn x => hd::x는 빈리스트를 생성 -

fun pick (_,[]) = [] 
    | pick (0,_) = [] 
    | pick (n,hd::tl) = 
     let 
     val with_hd = List.map (fn x => hd::x) (pick(n-1,tl)) 
     val without_hd = pick(n,tl) 
     in 
     [email protected]_hd 
end; 

답변

4

문제는 당신의 의심과 관련이 있습니다.

아무 것도없는 요소를 선택하면 성공하고 빈 목록이 생성됩니다.
즉, pick (0, _) = [[]] - 하나의 요소가 포함 된 목록이며 빈 목록입니다.

n = 0의 경우 pick(n, [])이 성공하지만 다른 의 경우는 성공하지 못하기 때문에 사례를 다시 정렬해야합니다. 요약

정확히 이전 함수의 나머지

fun pick (0, _) = [[]] 
    | pick (_, []) = [] 

.

+0

대단히 감사합니다! :) – Zooly92