我试图对erlang中排序集中的项目进行处理,我使用eredis调用ZRANGE KEY 0 -1 WITHSCORES
,问题是它返回类似[<<"item1">>, <<"100">>, <<"item2">>, <<"200">>]
的内容。如何有效地对这些项目运行函数f以便进行这些调用:f(<<"item1">>, <<"100">>)
,f(<<"item2">>, <<"200">>)
?
答案 0 :(得分:2)
我用这样的东西解决了它
f([X,Y|T]) -> [do_the_job(X,Y)|f(T)];
f([]) -> [].
然后打电话:
f(List).
这样做有效吗?
答案 1 :(得分:0)
优化的方法是使用尾递归。您可以将列表传递给do/1
函数,它会生成一个空列表,用于存储在给定列表的每两个头项上应用f/2
函数的结果,然后返回结果:
do(List) ->
do(List, []).
do([X,Y | Tail], Acc) ->
do(Tail, [f(X, Y) | Acc]);
do([], Acc) ->
lists:reverse(Acc).
f(X, Y) ->
{X, Y}.
Erlang documentation关于尾递归效率的说明:
在大多数情况下,递归函数在每次递归时在堆栈上使用的字数多于尾递归在堆上分配的字数。随着使用更多内存,垃圾收集器被更频繁地调用,并且它有更多的工作遍历堆栈。