我正在尝试在Erlang中对排序集合中的项目执行进程,我使用eredis调用ZRANGE KEY 0 -1 WITHSCORES
,但问题是它返回了类似于[<<"item1">>, <<"100">>, <<"item2">>, <<"200">>]
这样的结果。如何高效地运行函数f以便进行以下调用:f(<<"item1">>, <<"100">>)
, f(<<"item2">>, <<"200">>)
?
我正在尝试在Erlang中对排序集合中的项目执行进程,我使用eredis调用ZRANGE KEY 0 -1 WITHSCORES
,但问题是它返回了类似于[<<"item1">>, <<"100">>, <<"item2">>, <<"200">>]
这样的结果。如何高效地运行函数f以便进行以下调用:f(<<"item1">>, <<"100">>)
, f(<<"item2">>, <<"200">>)
?
f([X,Y|T]) -> [do_the_job(X,Y)|f(T)];
f([]) -> [].
然后调用:
f(List).
有更高效的方法吗?
一种优化的方法是使用尾递归。您可以将列表传递到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}.
在大多数情况下,递归函数每次递归使用的堆栈空间比尾递归分配在堆上的空间更多。随着使用的内存越来越多,垃圾回收器会更频繁地被调用,并且它需要遍历更多的堆栈。