0

以下のアルゴリズム/アルゴリズムトリックの一般的な名前を探しています。

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]

つまり、 のあるインデックスで見られる 1 の数を累積しxsます。また、これを行うためのより簡潔な方法はありますか? Scala、Python、Haskell の回答は大歓迎です。

4

2 に答える 2

0

私はそうは思いません。1つの値の累積合計を作成するのは基本的すぎます。理解できるように、コードはそのままにしておきます。

于 2012-12-12T22:14:28.560 に答える
0

Haskell では、これをより簡潔に書くことができ、a という名前が付けられていますscan(より正確には、左折り畳みの中間結果を蓄積するため、左スキャン)。

scanl1 (\y x -> y + if x == 1 then 1 else 0) xs

そして、実行中の合計については、さらに良い、

scanl1 (+) xs
于 2012-12-12T22:58:32.613 に答える