【发布时间】:2019-07-14 13:18:04
【问题描述】:
我试图实现一个 Haskell 函数,该函数将整数数组 A 作为输入 并产生另一个数组 B = [A[0], A[0]+A[1], A[0]+A[1]+A[2] ,...]。我知道 Data.List 中的 scanl 可以与函数 (+) 一起使用。我写了第二个实现 在看到 scanl 的源代码后(执行速度更快)。我想知道为什么第一个实现比第二个慢,尽管是尾递归的?
-- This function works slow.
ps s x [] = x
ps s x y = ps s' x' y'
where
s' = s + head y
x' = x ++ [s']
y' = tail y
-- This function works fast.
ps' s [] = []
ps' s y = [s'] ++ (ps' s' y')
where
s' = s + head y
y' = tail y
上面代码的一些细节:
实现一:应该叫
ps 0 [] a
'a' 是你的数组。
实现2:应该叫做
ps' 0 a
'a' 是你的数组。
【问题讨论】:
-
请注意,您处理的是(链接)列表,而不是数组。
-
而
head和tail是邪恶的。为什么不ps' s (y:ys) = s' : ps' s' ys where s' = s+y?好多了。
标签: haskell recursion tail-recursion