我试图在SML中实现k-out-of-N,所以" pick(3,[1,2,3,4])"将返回[[1,2,3],[1,3,4] ...](N个元素中的所有K大小的选择)
我使用了List.map,我认为它调用了函数并将其应用于每个元素。
在键入输入" pick(3,[1,2,3,4,5])&#34时,真的无法找出原因。例如,它返回一个空列表。
我的第一个想法是因为初始条款(选择(_,[])= []) 但改变它并没有起作用。
签名没问题(val pick = fn:int *'列表 - >'列表清单)。
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
with_hd@without_hd
end;
答案 0 :(得分:4)
问题与您的怀疑有关 - 基本情况不正确,因为它们总是产生空列表,而将fn x => hd::x
映射到空列表会产生空列表。
从任何东西中挑选零元素都应该成功,并生成空列表
也就是说,pick (0, _) = [[]]
- 一个包含一个元素的列表,即空列表。
您还需要重新排列案例,因为pick(n, [])
成功n = 0
,但其他任何n
成功。
总之,
fun pick (0, _) = [[]]
| pick (_, []) = []
与该函数的其余部分完全一样。