0

erlangにeratosphenesのふるいを実装しようとしています。ただし、アルゴリズムの2番目のステップを通過できません。マークされたエントリに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]]).

++で追加しようとしましたが、同じ結果になります。

4

2 に答える 2

1

上記のコードは、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]).

リバースなしでも機能しますが、適切な順序を維持するために、リバースまたは ++ を実行できます

于 2013-02-24T16:16:10.940 に答える