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 = ?