K实现N实现 - SML

时间:2017-12-31 01:35:24

标签: sml smlnj ml

我试图在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;

1 个答案:

答案 0 :(得分:4)

问题与您的怀疑有关 - 基本情况不正确,因为它们总是产生空列表,而将fn x => hd::x映射到空列表会产生空列表。

从任何东西中挑选零元素都应该成功,并生成空列表 也就是说,pick (0, _) = [[]] - 一个包含一个元素的列表,即空列表。

您还需要重新排列案例,因为pick(n, [])成功n = 0,但其他任何n成功。

总之,

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

与该函数的其余部分完全一样。