2017-11-04 1 views
0

저는 Erlang의 초보자이며 Reduce 함수의 관점에서 Map 함수를 구현하려고합니다. 그러나, 나는 당신이 그것을 할 수있는 방법을 사진 수 없었다 .. 나는 지금까지이 시도가 :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)]. 

내가 좀 순진이 솔루션을보고하고 그러나. 어떤 도움을 주시겠습니까?

답변

5

이미 감소 기능이있는 경우 재귀를 사용하여 목록을 매핑 할 필요가 없습니다. 함수로 (Acc, X) -> [F(X) | Acc]reduce에 전달한 다음 끝에 lists:reverse을 호출하면 목록이 역순으로 만들어지기 때문에 호출 할 수 있습니다.

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

목록에 요소를 추가하는 것이 O (n) 인 appending과 달리 O (1)이므로 역순으로 목록을 만듭니다. lists:reverse도이 맵 함수 O (n)을 만드는 O (1)에서 실행됩니다. 만약 우리가 fun(Acc, X) -> AcC++ [F(X)] end을했는데 반대가 없다면 그것은 O (n^2)가 될 것입니다.

+0

익명의 함수에서 F (X)를 사용한다고 생각합니다.하지만 감사합니다. :) –

+0

맞아, 고마워! – Dogbert