繁体   English   中英

了解素数生成器

[英]Understanding prime number generator

该站点显示了一个生成素数列表的函数。

-module(eratosthenes).
-export([prime_numbers/1]).

% Sieve of Eratosthenes algorithm for finding all prime numbers up to N.
% http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

% Generate list of prime numbers up to N.
prime_numbers(N) when is_number(N) ->
prime_numbers(N, generate(N)).

prime_numbers(Max, [H|T]) when H * H =< Max ->
   [H | prime_numbers(Max, [R || R <- T, (R rem H) > 0])];

prime_numbers(_, T) -> T.

% Generate sequence 2..N
generate(N) -> generate(N, 2).

generate(Max, Max) -> [Max];

generate(Max, X) -> [X | generate(Max, X + 1)].

我在以下位置不了解该功能:

prime_numbers(_, T) -> T.

我用笔和纸做了这个例子:

prime_numbers(5)

1 - prime_numbers(5, [2,3,4,5])
2 - [2 | prime_numbers(5, [R || R <- [3,4,5], (R rem H) > 0)]
3 - [2 | prime_numbers(5, [3,5])]

prime_numbers(5, [3,5])

H * H =< MAX

3*3 =< 5 (False)

prime_numbers(_, T) -> T.

H = 3
T = 5

prime_numbers(5, [3,5]) = [5]

resp: [2,5]


or prime_numbers(5, [3,5]) = [3|[5]]

要理解这一点,您必须查看整个功能:

prime_numbers(Max, [H|T]) when H * H =< Max ->
   [H | prime_numbers(Max, [R || R <- T, (R rem H) > 0])];
prime_numbers(_, T) -> T.

我删除了一个换行符,因为它在这种情况下实际上并不适用。 Erlang的惯用法是将函数的子句保持在一起,就像这样。 请注意,此函数有两个子句。 我们对它们进行模式匹配 [0] 因此,内容为:

“假设给我们一个名为Max东西,并用[H|T]列出了至少一个元素。将这个列表解构为head元素H和列表T的其余部分。现在,此模式有一个when守卫,因此它只如果H*H =< Max

如果这不匹配,请说出当when警卫错误或给我们一个空列表[] ,我们将尝试与下一个子句(_, T)匹配。 该参数始终匹配并丢弃第一个参数( _ )。 然后,它匹配第二个参数中的任何内容,并将其绑定到T 然后它运行它的身体。”

理解这一点的关键是了解模式匹配。 一旦掌握了这些内容,代码就应该清晰易读。

[0]查找模式匹配的概念。 它是许多语言(例如Prolog,ML,Haskell,Erlang等)的核心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM