我正试图在二郎中实施一种eratosphenes筛子。但是我无法超越算法的第二步。我用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]]).
我也尝试用++附加,但结果相同。
答案 0 :(得分:1)
以上代码仅运行一次。
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]).
即使没有反向也可以工作,但为了维持正确的顺序,我们可以做反向或++
答案 1 :(得分:0)
如果您的目的是教育,将质数存储在列表中是可以的,而且vinod的解决方案很好。但是如果你必须使用这个列表,那么我认为ETS表(有序集)可能更方便。
另一点,erathostene算法的一个弱点是你首先创建一个巨大的列表(如果你需要很多)然后删除大部分元素。您可以轻松地将初始列表L = [2|lists:seq(3,Max,2)]
除以2。您也可以初始化列表/表格而不是2,3,5的倍数,创建时间更短,消除时间更短。