Erlang-- 學習筆記4,函數式程序設計

備註:Erlang-- 學習筆計,知識要點來自於維基百科,一些不容易懂的地方,我給出重新解釋,方便自己理解和記憶,如果有錯誤,請大家不吝指教。

  1.  例一:以整數階乘模塊爲例,遞歸調用
    -module(fact).
    -export([fac/1]).
    
    fac(N) when N > 1 ->                % N大於1的時候執行
        N * fac(N-1);
    fac(1) ->                           % N等於1的時候執行
        1.

  2.  例二:以下是快速排序算法的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

  3.  例三: 以下是費氏數列求解函數
    -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]

  4.  例四:函數式程序設計難免以遞歸計算,而消耗了大量遞歸堆棧空間。爲了克服這個問題,一般使用累積參數尾部遞歸等技巧節省遞歸數目:如以下例子
    -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]

  5.  例五:函數式程序設計容許使用高級函數求解。以下例子說明Erlang實做複合函數。 ( f o g ,唸作 f after g 。)
    'After'(F, G) ->
         fun(X) ->
             erlang:apply(F, [erlang:apply(G, [X])])
         end.
    請注意after是Erlang關鍵字。因此,以上函數命名爲′After′避開關鍵字
    > (example:'After'(fun test:show/1, fun test:parse/1))(3.1416).
    Real number 3.141600 is met.
    ok

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章