備註:Erlang-- 學習筆計,知識要點來自於維基百科,一些不容易懂的地方,我給出重新解釋,方便自己理解和記憶,如果有錯誤,請大家不吝指教。
- 例一:以整數階乘模塊爲例,遞歸調用
-module(fact). -export([fac/1]). fac(N) when N > 1 -> % N大於1的時候執行 N * fac(N-1); fac(1) -> % N等於1的時候執行 1.
- 例二:以下是快速排序算法的Erlang實現
%% quicksort:qsort(List) %% Sort a list of items -module(quicksort). -export([qsort/1]). qsort([]) -> []; qsort([Pivot|Rest]) -> qsort([ X || X <- Rest, X <= Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Rest, Y > Pivot]). % [ X || X <- Rest, X <= Pivot] % 等價於下面表達式 % if(Rest<=Pivot) % X = Rest
- 例三: 以下是費氏數列求解函數
-module(example). -export([fibo/1]). fibo(N) when N > 1 -> fibo(N-1) + fibo(N-2); fibo(1) -> 1; fibo(0) -> 0.
> c(example). {ok,example} > lists:map(fun(X)->test:fibo(X) end, lists:seq(1,10)). [1,1,2,3,5,8,13,21,34,55]
- 例四:函數式程序設計難免以遞歸計算,而消耗了大量遞歸堆棧空間。爲了克服這個問題,一般使用累積參數與尾部遞歸等技巧節省遞歸數目:如以下例子
-module(test). -export([fibo_accu/1]). fibo_accu(N) -> fibo(N, 0, 1). fibo(N, C1, C2) when N > 2 -> fibo(N-1, C2, C1+C2); fibo(0, _, _) -> 0; fibo(1, _, _) -> 1; fibo(_, C1, C2) -> C1+C2.
> c(example). {ok,test} > lists:map(fun(X)->test:fibo_accu(X) end, lists:seq(1,10)). [1,1,2,3,5,8,13,21,34,55]
- 例五:函數式程序設計容許使用高級函數求解。以下例子說明Erlang實做複合函數。
( f o g ,唸作 f after g 。)
請注意after是Erlang關鍵字。因此,以上函數命名爲′After′避開關鍵字'After'(F, G) -> fun(X) -> erlang:apply(F, [erlang:apply(G, [X])]) end.
> (example:'After'(fun test:show/1, fun test:parse/1))(3.1416). Real number 3.141600 is met. ok