我想找到第一个负数之前的所有正数之和。
我在长生不老药中得到了以下列表。
popupView.layer.shadowPath = UIBezierPath(rect: popupView.bounds).cgPath
我计算出该列表的总和如下
iex(4)> steps = [0,1,2,3,-4,5,6,-1]
一旦碰到负数,如何减少?
答案 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
;