我正在通过 projecteuler.net 上的问题来学习如何在 Erlang 中编程,而我最难的是创建一个可以在不到一分钟的时间内创建所有低于 200 万的素数的素数生成器。使用顺序样式,我已经编写了三种类型的生成器,包括 Eratosthenes 的筛子,它们都没有表现得足够好。
我认为并发 Sieve 会很好用,但我收到 bad_arity 消息,我不知道为什么。关于我为什么遇到问题或如何正确编码的任何建议?
这是我的代码,注释掉的部分是我试图使事情并发的地方:
-模块(主服务器)。
-编译(export_all)。
开始()->
注册(素数,产卵(乐趣()->循环()结束))。
is_prime(N) -> rpc({is_prime,N})。
RPC(请求)->
素数!{self(), 请求},
收到
{素数,响应} ->
回复
结尾。
循环()->
收到
{来自,{is_prime,N}} ->
如果
N 从!{素数,假};
N =:= 2 -> 从!{素数,真};
N rem 2 =:= 0 -> 从!{素数,假};
真->
值 = is_not_prime(N),
Val = not(lists:member(true, Values)),
从 !{素数,瓦尔}
结尾,
环形()
结尾。
for(N,N,_,F) -> [F(N)];
for(I,N,S,F) 当 I + S [F(I)|for(I+S, N, S, F)];
for(I,N,S,F) 当 I + S =:= N -> [F(I)|for(I+S, N, S, F)];
当 I + S > N -> [F(I)] 时,for(I,N,S,F)。
get_list(I, 限制) ->
如果
一世
[我*A || 一种
[]
结尾。
is_not_prime(N) ->
对于(3, N, 2,
乐趣(一)->
列表 = get_list(I,trunc(N/I)),
列表:成员(N,列表:展平(列表))
结尾
)。
%%L = for(1,N, fun() -> spawn(fun(I) -> wait(I,N) end) end),
%%SeedList = [A || 一种
%% 列表:foreach(fun(X) ->
%% 密码!{in_list, X}
%% 结束,种子列表)
%% 结束,L)。
%%等待(I,N) ->
%% 列表 = [I*A || 一个列表:成员(X,列表)
%% 结尾。