Я изучаю Эрланг. В качестве упражнения я подобрал алгоритм генерации простых чисел Sieve of Eratosthenes. Вот мой код:Сито Эратосфена в Эрланге
-module(seed2).
-export([get/1]).
get(N) -> WorkList = lists:duplicate(N, empty),
get(2, N, WorkList, []).
get(thats_the_end, _N, _WorkList, ResultList) -> lists:reverse(ResultList);
get(CurrentPrime, N, WorkList, ResultList) -> ModWorkList = markAsPrime(CurrentPrime, N, WorkList),
NextPrime = findNextPrime(CurrentPrime + 1, N, WorkList),
get(NextPrime, N, ModWorkList, [CurrentPrime|ResultList]).
markAsPrime(CurrentPrime, N, WorkList) when CurrentPrime =< N -> WorkListMod = replace(CurrentPrime, WorkList, prime),
markAllMultiples(CurrentPrime, N, 2*CurrentPrime, WorkListMod).
markAllMultiples(_ThePrime, N, TheCurentMark, WorkList) when TheCurentMark > N -> WorkList;
markAllMultiples(ThePrime, N, TheCurrentMark, WorkList) -> WorkListMod = replace(TheCurrentMark, WorkList, marked),
markAllMultiples(ThePrime, N, TheCurrentMark + ThePrime, WorkListMod).
findNextPrime(Iterator, N, _WorkList) when Iterator > N -> thats_the_end;
findNextPrime(Iterator, N, WorkList) -> I = lists:nth(Iterator, WorkList),
if
I =:= empty -> Iterator;
true -> findNextPrime(Iterator + 1, N, WorkList)
end.
replace(N, L, New)-> {L1, [_H|L2]} = lists:split(N - 1, L),
lists:append(L1, [New|L2]).
Этот код фактически работает :). Проблема в том, что у меня такое ощущение, что это не самая лучшая реализация.
Мой вопрос, что было бы «erlangish» способ реализации «Решето Эратосфена»
EDIT: Хорошо, решение Andreas очень хорошо, но это очень медленный процесс. Любые идеи, как улучшить это?
Этот вопрос, как представляется, OFF- потому что он принадлежит http://codereview.stackexchange.com/ – Toto 2014-02-01 17:42:24
Посмотрите на http: // co dereview.stackexchange.com/questions/118204/sieve-of-eratosthenes-in-erlang/135495. – 2016-07-21 13:09:30