我正在寻找以下算法/算法技巧的通用名称。
xs = [0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1]
ys = [xs[0]]
for i in range(1, len(xs)):
if xs[i] == 1:
ys.append(ys[i - 1] + 1)
else:
ys.append(ys[i - 1])
print ys
# prints: [0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5]
即,累计在xs
的某个索引处看到的1的数量。此外,有没有更简洁的方法来做到这一点?欢迎使用Scala,Python和Haskell的答案。
答案 0 :(得分:0)
我不这么认为,这对于一个值来说,累积总和太基本了。保持代码原样,这是可以理解的。
答案 1 :(得分:0)
在Haskell中,可以写得更简洁,并且它被命名为scan
(更确切地说是左扫描,因为它累积了左折叠的中间结果),
scanl1 (\y x -> y + if x == 1 then 1 else 0) xs
并且,对于运行总和,甚至更好,
scanl1 (+) xs