[英]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.