2017-11-04 1 views
0

Ich bin ein Anfänger in Erlang und ich versuche, die Map-Funktion in Bezug auf die Reduce-Funktion zu implementieren. Allerdings konnte ich nicht vorstellen, wie Sie es tun können .. Ich habe schon versucht, diese so weit:Implementieren Karte in Bezug auf reduzieren in Erlang

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)]. 

aber ich diese Lösung ein wenig naiv bin zu sehen. Irgendwelche Hilfe bitte?

Antwort

5

Sie müssen die Rekursion nicht verwenden, um eine Liste zuzuordnen, wenn Sie bereits eine Reduzierungsfunktion haben. Sie können einfach (Acc, X) -> [F(X) | Acc] als Funktion an reduce übergeben und dann am Ende lists:reverse aufrufen, da die Liste in umgekehrter Reihenfolge erstellt wird.

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

Wir sind die Liste in umgekehrter Richtung zu schaffen, weil ein Element, um eine Liste vorangestellt ist, O (1) Im Gegensatz zu Anfügen, die O (n) ist. lists:reverse läuft auch in O (1), die diese Kartenfunktion O (n) macht. Wenn wir fun(Acc, X) -> AcC++ [F(X)] end und keine Umkehrung gemacht haben, ist das O (n^2).

+0

Ich denke, du hast F (X) in der anonymen Funktion .. aber danke trotzdem :) –

+0

Sie haben Recht, repariert, danke! – Dogbert