2014-03-26 2 views
2

첫 번째 인수가 술어 함수 인 Erlang에서 파티션 바이 함수를 만들려고합니다.Erlang에서 partition_by 함수 구현

step(_, [ ]) -> 
    [ ]; 

step(N, C) -> 
    [_ | T] = C, 
    case (N > 0) and (length(C) > 0) of 
    true -> 
     step(N - 1, T); 
    false -> 
     C 
    end. 

drop(_, [ ]) -> 
    [ ]; 

drop(Number, Collection) -> 
    step(Number, Collection). 

partition_by(_, [ ]) -> 
    [ ]; 

partition_by(F, Collection) -> 
    [H | T] = [Collection], 
    Head_value = F(H), 
    Run = [H | lists:takewhile(fun(E) -> Head_value =:= F(E) end, T)], 
    [Run | partition_by(F, erl_funcs:drop(length(Run), Collection))]. 

그러나 전화 :

partition_by(fun(E) -> E > 0 end, [-44444, -4555555, 455555]). 

내가 갖는 :

[[[-44444,-4555555,455555]],[[-4555555,455555]],[[455555]]] 

아니 정확히 내가 생각하고있어. 어떤 아이디어가 잘못 될까요?

답변

1

나는 원하는 출력을 제공하지 않았지만 어떻게 할 것인지 잘 모르겠다.

partition_by(F, [H|T]) -> 
    partition_by(F, F(H), T, [H]). 

partition_by(F, HV, [H|T] = L, Acc) -> 
    case F(H) of 
    HV -> partition_by(F, HV, T, [H|Acc]); 
    _ -> {lists:reverse(Acc), L} 
    end; 
partition_by(_, _, [], Acc) -> {lists:reverse(Acc), []}. 
+0

네, 정확히 그게 내가 찾고 있어요 출력입니다. 원래 알고리즘의 문제점은 무엇입니까? – Chiron

+0

전화 목록의 성능 영향 : 큰 목록에서 역방향/1? – Chiron

+0

C에서 BIF로 구현 된 O (n) 시간 및 O (n) 공간 연산입니다. 어쨌든 당신은 시도하고 측정 할 수 있습니다. 내 코드가 더 나을거야. –

1

이 라인 [H | T] = [Collection],은 코드에서 잘못되었습니다. [H | T] = Collection,으로 변경합니다.

목록 Collection에서 하나의 요소를 가져오고 싶으므로 [H | T] = Collection이 필요합니다. [H | T] = [Collection]을 사용하면 H = Collection, T = []을 의미합니다.

여기 내 전체 코드가 있습니다.

-module(wy). 
-compile(export_all). 

drop(_, []) -> 
    []; 
drop(0, Collection) -> 
    Collection; 
drop(Number, [_H | T]) -> 
    drop(Number - 1, T). 

partition_by(_, [ ]) -> 
    [ ]; 

partition_by(F, Collection) -> 
    [H | T] = Collection, 
    Head_value = F(H), 
    Run = [H | lists:takewhile(fun(E) -> Head_value =:= F(E) end, T)], 
    [Run | partition_by(F, ?MODULE:drop(length(Run), Collection))]. 

main() -> 
    T = partition_by(fun(E) -> E > 0 end, [-44444, -4555555, 455555]), 
    io:format("~w~n", [T]). 

출력은 다음과 같습니다 [[-44444,-4555555],[455555]]

+0

이 목록을 시도한 경우 [-44444, -4555555, 455555, -344300, 89894] 출력은 [[-44444, -4555555], [455555], [- 344300], [89894]] – Chiron

+0

@ Chiron : 예상 결과가 아니라면 질문에 답변을 제공하지 않았기 때문일 수 있습니다. –