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

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