2014-09-30 43 views
0

這是我第一個Erlang項目。基本上,我必須編寫一個函數,它以整數列表作爲參數&返回列表中小於1的整數數量。到目前爲止,我到目前爲止只是返回列表中多少個整數的函數。我不知道在哪裏/如果我應該把if語句和計數器只返回多少整數都小於1。Erlang - 如何返回計數/元素數

-export([num/1]). 

num([]) -> 0 ; 
num(L) -> num(L,0). 

num([],Len) -> Len; 
num([_|T],Len) -> 
    num(T,Len+1). 

回答

2

你的代碼是幾乎沒有。學習的關鍵技巧:guard

-export([num/1]). 

num([]) -> 0; 
num(NUMS) -> 
     num(NUMS, 0). 

num([H|L], Count) when H < 1 -> %% use of guard 
     num(L, Count+1); 
num([_|L], Count) -> 
     num(L, Count); 
num([], Count) -> 
     Count. 
8

您可以使用長度()找到一個列表的長度,並可以使用 list comprehensions 來過濾您的列表。

num(L) -> length([X || X <- L, X < 1]). 

工作例如:

% list counter program 
-module(listcounter). 
-export([printnum/0, num/1]). 

printnum() -> 
    L = [1,2,3,0,0], 
    io:fwrite("List size: ~p\n",[num(L)]). 

num(L) -> 
    length([X || X <- L, X < 1]). 
+0

雖然這個解決方案創建了一箇中間列表,然後解析它來計算元素,但列表理解和bif length()看起來確實被優化了,結果是它是最快的 – Pascal 2014-10-03 05:45:17

1

這一個避免建立一箇中間名單。與安東尼提議使用erlang庫和匿名函數大致相同。

lists:foldl(fun(X,Count) when X < 1 -> Count+1; (_,Count) -> Count end,0,L).