簡體   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