Erlang:可以不使用list:reverse吗?
|
我是学习Erlang的初学者。在阅读完有关Erlang的列表推导和递归之后,我想尝试实现自己的
map
函数,结果如下所示:
% Map: Map all elements in a list by a function
map(List,Fun) -> map(List,Fun,[]).
map([],_,Acc) -> lists:reverse(Acc);
map([H|T],Fun,Acc) -> map(T,Fun,[Fun(H)|Acc]).
我的问题是:通过递归函数建立一个列表,然后在最后将其反向,这是错误的。有什么方法可以按正确的顺序建立列表,所以我们不需要相反的顺序?
没有找到相关结果
已邀请:
2 个回复
荒劫娇噬
的主体递归版本,它将在12之前的Erlang版本上使用更多的内存,但在当前版本上不会使用更多的内存:
这是使用列表推导的map版本:
如您所见,这很简单,因为
只是列表理解的一部分,因此您可以直接使用列表理解,而不再需要
。 另外,还有一个纯Erlang实现,它显示了反转cons单元列表的效率如何(在Erlang中,调用
总是更快,因为它在C中,但执行相同的操作)。
如您所见,列表上只有
个操作,将cons单元分开(在模式匹配时),并在进行
时新建一个。
芯伶句餐绕