备注: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