例如,一个函数通过 consing 创建一个列表:
fun example1 _ _ [] = []
| example1 f g (x::xs) =
if f x
then (g x)::(example1 f g xs)
else x::(example1 f g xs)
一个通过尾调用累加器创建一个列表:
fun example2 f g xs =
let fun loop acc [] = acc
| loop acc (x::xs') =
if f x
then loop (acc@[(g x)]) xs'
else loop (acc@[x]) xs'
in
loop [] xs
end
在给定相同参数的情况下生成相同的列表。
哪个函数的运行时间更好?
追加操作是否会@
遍历到列表的末尾以追加并最终与 consing 解决方案具有相同的运行时间,但使用更少的空间和稍微复杂的代码?
consing 或 append 是否会创建一个全新的元素(对象的深层副本),即使原始元素没有更改或者它只是重用现有元素?
这个问题为这个问题提供了一个更具体的例子