我正在通过 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,列表) %% 结尾。