Erlang eratosphenes算法的筛选

Erlang eratosphenes算法的筛选,erlang,prime-factoring,Erlang,Prime Factoring,我正试图在erlang中实现对埃拉托芬的筛选。然而,我无法通过算法的第二步。我用p填充标记的条目,这样当我遍历列表直到找到一个大于p的值时,我就会知道它也是素数 -module(sieve). -export([primes/0]). primes() -> L = lists:seq(2,20), mark(L,2). mark(L,P) -> mark(L,P,2,[]). mark([],_,_,N) -> N;

我正试图在erlang中实现对埃拉托芬的筛选。然而,我无法通过算法的第二步。我用p填充标记的条目,这样当我遍历列表直到找到一个大于p的值时,我就会知道它也是素数

    -module(sieve).
    -export([primes/0]).

    primes() -> L = lists:seq(2,20),
    mark(L,2).

    mark(L,P) -> mark(L,P,2,[]).

    mark([],_,_,N) -> N;
    mark([_|T],P,C,N) when C =:= P -> mark(T,P,C+1,[N|[P]]);
    mark([H|T],P,C,N) -> mark(T,P,C,[N|[H]]).

我也试着用++附加,但结果是一样的。

上面的代码只运行一次

primes() ->
    List = lists:seq(2,100),
    mark([], List).

mark(Primes, []) ->
    lists:reverse(Primes);
mark(Primes, _List = [H| T]) ->
    mark([H | Primes], H, T, []).

mark(Primes, _P, [], NewList) -> 
    mark(Primes, lists:reverse(NewList));
mark(Primes, P, [H | T], NewList) when H rem P == 0 ->
    mark(Primes, P, T, NewList);
mark(Primes, P,[H | T], NewList) ->
    mark(Primes, P, T, [H | NewList]).

即使没有反转也可以工作,但是为了保持正确的顺序,我们可以做反转或+++

如果你的目的是为了教育,在列表中存储素数是可以的,vinod的解决方案是好的。但如果您必须使用此列表,那么我认为ETS表(有序集)可能更方便

另一点,erathostene算法的一个弱点是,首先创建一个巨大的列表(如果需要很多),然后删除大部分元素。您可以轻松地将初始列表除以2
L=[2 |列表:seq(3,Max,2)]
。您还可以在不使用2,3,5的倍数的情况下初始化列表/表格,创建和删除列表/表格的时间更短