首页 > Erlang并发教程 > 4.6 Erlang并发编程-素数
2013
11-06

4.6 Erlang并发编程-素数

素数
在我们的最后一个例子(程序3.3)中,我们将来看看如何使用埃拉托色尼筛法来生成一张素数表。

程序 3.3

-module(siv).
-compile(export_all).

range(N, N) ->
    [N];
range(Min, Max) ->
    [Min | range(Min+1, Max)].

remove_multiples(N, [H|T]) when H rem N == 0 ->
    remove_multiples(N, T);
remove_multiples(N, [H|T]) ->
    [H | remove_multiples(N, T)];
remove_multiples(_, []) ->
    [].

sieve([H|T]) ->
    [H | sieve(remove_multiples(H, T))];
sieve([]) ->
    [].

primes(Max) ->
    sieve(range(2, Max)).

注意在程序3.3中我们使用了编译器标注-compile(export_all)——这将隐式地导出该模块中的所有函数,于是我们无须显式地给出导出申明便可以调用这些函数。

range(Min, Max)返回一个包含从Min到Max的所有整数的列表。

remove_multiples(N, L)从列表L删除中N的倍数:

> siv:range(1,15).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
> siv:remove_multiples(3,[1,2,3,4,5,6,7,8,9,10]).
[1,2,4,5,7,8,10]
sieve(L)保留列表L的头部,对于尾部的列表,则再递归地删除其头部的所有倍数:

> siv:primes(25).
[2,3,5,7,11,13,17,19,23]


留下一个回复

你的email不会被公开。