K实现N实现 - SML

问题描述 投票:3回答:1

我试图在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])”时,例如,它返回一个空列表。

我的第一个想法是,这是因为初始条款(选择(_,[])= [])但改变它并不起作用。

签名是可以的(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;
sml smlnj ml
1个回答
4
投票

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

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

你需要重新安排案件,因为pick(n, [])成功为n = 0而不是任何其他n

综上所述,

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

与之前完全相同的功能。

© www.soinside.com 2019 - 2024. All rights reserved.