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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值