【问题标题】:K out on N implementation - SMLK out on N 实施 - SML
【发布时间】:2017-12-31 01:35:24
【问题描述】:

我试图在 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 * 'a list -> 'a list list)。

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】:

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

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

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

    总之,

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

    函数的其余部分与以前完全相同。

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 2017-08-22
      • 1970-01-01
      • 2015-12-31
      • 2012-11-06
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多