代码之家  ›  专栏  ›  技术社区  ›  Dylan Galea

在Erlang中用Reduce实现Map

  •  0
  • Dylan Galea  · 技术社区  · 7 年前

    我是Erlang的初学者,我正在尝试用Reduce函数实现Map函数。然而,我无法想象你如何做到这一点。。我有 到目前为止尝试过:

    reduce(_, Acc, [])     -> Acc;
    reduce(Fn,Acc,[Hd|Tl]) -> reduce(Fn,Fn(Acc,Hd),Tl). 
    
    map(F,[])      -> [];
    map(F,[Hd|Tl]) -> [reduce(F,F(Hd),[]) | map(F,Tl)].
    

    然而,我觉得这个解决方案有点幼稚。需要帮忙吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Dogbert    7 年前

    如果已经有reduce函数,则不需要使用递归映射列表。你可以通过 (Acc, X) -> [F(X) | Acc] 作为功能 reduce lists:reverse 因为列表将按相反顺序创建。

    map(F, List) -> lists:reverse(reduce(fun(Acc, X) -> [F(X) | Acc] end, [], List)).
    

    我们以相反的方式创建列表,因为在列表中预先添加一个元素是O(1),而追加是O(n)。 列表:反转 也在O(1)中运行,这使得该映射函数为O(n)。如果我们这样做了 fun(Acc, X) -> Acc ++ [F(X)] end 没有相反的结果,那就是O(n^2)。