我该如何突破长生不老药中的Enum.reduce

时间:2018-09-20 19:50:28

标签: erlang elixir

我想找到第一个负数之前的所有正数之和。

我在长生不老药中得到了以下列表。

popupView.layer.shadowPath = UIBezierPath(rect: popupView.bounds).cgPath

我计算出该列表的总和如下

iex(4)> steps = [0,1,2,3,-4,5,6,-1]

一旦碰到负数,如何减少?

4 个答案:

答案 0 :(得分:13)

使用Enum.reduce_while https://hexdocs.pm/elixir/Enum.html#reduce_while/3

[1,2,3,-4,5,6,-1] |> Enum.reduce_while(0, fn x, acc ->
   if x > 0, do: {:cont, acc + x}, else: {:halt, acc}
end )

答案 1 :(得分:7)

您可以使用Enum.take_while/2

从枚举的开头获取项目,而fun返回真实值。

Enum.take_while([0, 1, 2, 3, -4, 5, 6, -1], fn(x) -> x >= 0 end) |> Enum.sum

=> 6

或使用速记

list = [0, 1, 2, 3, -4, 5, 6, -1]
Enum.take_while(list, &(&1 >= 0)) |> Enum.sum

答案 2 :(得分:1)

以Erlang语法:

1> L = [1,2,3,-4,5,6,-1].
[1,2,3,-4,5,6,-1]
2> lists:foldl(fun(X,{S,true}) when X >= 0 -> {S+X,true}; (_,{S,_}) -> {S,false} end,{0,true},L).
{6,false}

当然,即使第一个元素为负,此函数也会解析完整列表。一个简单的“手工制作”代码将避免这种情况:

3> SW = fun SW([H|T],S) when H >= 0 -> SW(T,S+H); SW(_,S) -> S end.
#Fun<erl_eval.36.127694169>
4> SumWhilePos = fun(P) -> SW(P,0) end.
#Fun<erl_eval.6.127694169>
5> SumWhilePos(L).
6

答案 3 :(得分:1)

这里的答案缺乏递归解决方案,这里是:

expression
    : identifier
    | '(' expression ')'
    | // other types of expression
    ;