이제 Sequential Erlang (그리고 함수형 프로그래밍)에 익숙해졌습니다. 그래서 BIF의 도움없이 다음 두 가지 기능을 구현하고 싶습니다. (내가 여기 해달라고 부탁하는)Erlang에서리스트를 오른쪽으로 회전
-export(leftrotate/1, rightrotate/1).
%%(1) left rotate a lits
leftrotate(List, 0) ->
List;
leftrotate([Head | Tail], Times) ->
List = append(Tail, Head),
leftrotate(List, Times -1).
append([], Elem)->
[Elem];
append([H|T], Elem) ->
[H | append(T, Elem)].
%%right rotate a list, how?
%%
나는이 연습에서 BIF을 사용하지 않으 하나는 left_rotate
이다 (필자는 솔루션과 함께 올라와있다있는) 다른 하나는 right_rotate
입니다. 올바른 순환 게재는 어떻게해야합니까?
관련 질문과 약간 더 중요한 질문. 내 구현 중 하나가 효율적인지 알 수 있습니까? 예 : BIF의 도움을 받아 구현하면 불필요한 재귀를 피할 수 있습니다.
BIF는 일부 기능을 향상시키기 위해 만들어 졌다고 생각합니다. 능률적 인 프로그래밍이 좋지 않은 효율성 (또는 우리가 '기능적 방식'으로 수행하는 경우 성능이 최적이 아님) 당신은 기능적인 관점에서 생각하려는 경우
왼쪽 회전과 Roberto의 왼쪽의 차이점은 왼쪽 회전에서 각 단계마다 append (Tail과 관련하여 O (n)에서 실행 됨)를 호출하여 총 실행 시간을 O (m * n), 여기서 m은 회전 할 단계 수입니다. 누산기 변수를 사용하고 끝에 그것을 반전하는 것은 그것을 다루는 일반적인 방법입니다; Roberto의 좌익은 O (m + n)에서 뛰었습니다. 일반적으로 BIF가 더 효율적입니다. 그렇지만 알고리즘을 올바로 적용하는 것이 가장 중요합니다. – legoscia
왼쪽 ([a, b, c], 16)? – Zed
수정되었습니다. 고마워, 제드. –