목록 이해는 여전히 메모리에 보조 목록을 만들 수 강제로. 거대한 데이터 세트를 다루는 경우에는 피해야합니다. 재귀 함수를 매번 작성하는 것은 어색하기 때문에 함수에 대한 제네릭 자체를 제안했습니다. 직접 재귀 나 목록 이해보다 트래버스 속도가 약간 느리지 만 메모리가 안정하고 일반적이며 사용하기 쉽습니다.
사용법 :
(for({10}))(
fun (X) -> io:format("~p ",[X]) end).
> 1 2 3 4 5 6 7 8 9 10
(for({10, -10, -2}))(
fun (X) -> io:format("~p ",[X]) end).
> 10 8 6 4 2 0 -2 -4 -6 -8 -10
너무 목록과 작품 :
(for(lists:seq(10, -10, -2)))(
fun (X) -> io:format("~p ",[X]) end).
> 10 8 6 4 2 0 -2 -4 -6 -8 -10
이 함수로 단계 또는 가드 정의 할 수도 있습니다 : 당신이 위해에 전달하면
(for({256, 1.1, fun (X) -> math:sqrt(X) end, fun (X, Range) -> X > Range end}))(
fun (X) -> io:format("~p ",[X]) end).
> 256 16.0 4.0 2.0 1.4142135623730951 1.189207115002721
을 두 개의 매개 변수 함수, 그럼 당신은 목록과 같은 accumulator 기능을 사용할 수 있습니다 : foldl/3.
Fact = (for(1, {1, 5}))(
fun(X, Acc) ->
X * Acc
end),
io:format("~p", [Fact]).
> 120
e_fact(N) ->
{_, E} = (for({1, 1}, {1, N}))(% i assumed 1/0! equals 1
fun(X, {LastFact, Sum}) ->
Fact = LastFact * X,
{Fact, Sum + 1/Fact}
end),
E.
io:format("e=~p", [e_fact(10)]).
> e=2.7182818011463845
또한 초기 누적기를 전달해야합니다. 단계 및 가드 기능은 누적기에 의존 할 수 있습니다. 하나의 매개 변수로 함수를 전달하십시오. 피타고라스 수를 찾는
중첩 루프. 종결 용이 :
pyth_lists(N) ->
[io:format("~p ", [{A, B, C}]) ||
A <- lists:seq(1, N),
B <- lists:seq(A + 1, N),
C <- lists:seq(B + 1, N),
A * A + B * B == C * C].
pyth_for(N) ->
(for({1, N}))(
fun(A) ->
(for({A + 1, N}))(
fun(B) ->
(for({B + 1, N}))(
fun(C) ->
case A * A + B * B == C * C of
true -> io:format("~p ", [{A, B, C}]);
false -> ok
end
end)
end)
end).
외부 저장소에는 너무 작습니다. 나는 그것을 유틸리티 모듈에 보관한다. 도움이 될만한 코드는 다음과 같습니다.