Sml 用零填充列表的末尾

Sml 用零填充列表的末尾,sml,smlnj,ssml,sysml,Sml,Smlnj,Ssml,Sysml,我们有一个类似于[13,7,8,4]的列表和一个数字N。我们希望在该列表末尾插入数字为“N mod ListSize”的元素(一些零)。假设N=6,根据列表,ListSize为4。所以6 mod 4=2,然后我必须在其中插入2个零,就像这样:[13,7,8,4,0,0] 我们如何通过SML中的函数实现这一点 在列表末尾填充是一种O(n)操作。如果orig是您的原始列表,而zeroes是您正在填充的零,orig@zeroes涉及将orig的每个元素都预先添加到zeroes 组合方法是首先找到零的数

我们有一个类似于
[13,7,8,4]
的列表和一个数字N。我们希望在该列表末尾插入数字为“N mod ListSize”的元素(一些零)。假设N=6,根据列表,ListSize为4。所以6 mod 4=2,然后我必须在其中插入2个零,就像这样:
[13,7,8,4,0,0]


我们如何通过SML中的函数实现这一点

在列表末尾填充是一种O(n)操作。如果
orig
是您的原始列表,而
zeroes
是您正在填充的零,
orig@zeroes
涉及将
orig
的每个元素都预先添加到
zeroes

组合方法是首先找到零的数量,然后创建这些零,然后附加它们

fun numberOfZeroes xs n = n mod List.length xs

fun replicate x 0 = []
  | replicate x n = x :: replicate x (n-1)

fun zeroes xs n = replicate 0 (numberOfZeroes xs n)

fun pad xs n = xs @ zeroes xs n
您可以通过在添加零的同时计算
xs
的长度来保存一次遍历(不同于单独的
length
/
@
)。组合函数可能如下所示:

fun pad xs n =
    let fun pad' (x::xs) count = x :: pad' xs (count + 1)
          | pad' [] count = replicate 0 (count mod n)
    in pad' xs 0 end
但是,此函数不是尾部递归函数,因此对于大型
xs
,它可能会耗尽堆栈空间。(
replicate
也不是,但只会生成长度为N的列表。)要使它以一种或另一种方式进行尾部递归,必须遍历列表两次。此外,用不太复杂的函数构建复杂函数可以减少认知负荷

最后,你对问题的描述很好。下一次,当您对一个问题有一个类似的清晰描述时,请尝试编写一个正确实现将通过的测试。例如,您描述的测试是:

val test1 = pad [13,7,8,4] 6 = [13,7,8,4,0,0]
除了一个测试之外,还要添加更多测试,直到您定义了所有角落案例。例如:

val test2 = pad [13,7,8,4] 4 = ?