天天看點

Erlang實戰練習(一)

原文連結如下:http://www.cnblogs.com/itfreer/archive/2012/05/04/Erlang_in_practise.html

前兩次主要講了Erlang并發與并發的一些概念,為了更加快速的直接切入主題,我不再接着上次的話題,從本文開始,主要從實戰角度分析Erlang、學習Erlang、總結Erlang。

練習1:生成斐波那契數列!

此練習比較簡單,結果自己去測驗,直接上代碼:

-module(feibo).  %% 子產品名與檔案名feibo.erl一緻
-export([feibo_list/1,element/1]).%%導出函數element、feibo_list,其中反斜杠"/"後面跟的整數值表示函數的參數個數

%% 編譯:c(feibo).
%% 運作:feibo:feibo_list(5).
%% 結果示例:【1,1,2,3,5】

%% 函數element主要為了計算斐波那契數列的第N個元素
element(1) -> 1;
element(2) -> 1;
element(N) -> element(N-1) + element(N-2).

%% 給定一個N,求出斐波那契的前N個數
feibo_list(N) -> feibo_list([], N).

feibo_list(L, 0) -> L;
feibo_list(L, N) -> feibo_list([element(N)|L], N-1).
           

練習2:求清單元素平均值!

此練習也是比較基礎,結果自己去測驗,不再多解釋,直接上代碼:

-module(average).
-export([num/1,sum/1,count_average/1]).

num([]) -> 0; 
num([H|T]) -> 1+num(T).

sum([]) -> 0;
sum([H|T]) -> H + sum(T).

count_average([]) -> 0;
count_average(L) -> sum(L)/num(L).
           

練習3:求12+22+32+42+52+…+n2。

此練習也是比較基礎,輸入為N,輸出為前N個數的平方和,直接上代碼:

-module(square).
-export([sum_square/1]).

compute_square(X) -> X*X.

sum_square(1) -> compute_square(1);
sum_square(N) -> sum_square(N-1) + compute_square(N).
           

練習4:将兩個清單連接配接起來。

将清單L1和L2連接配接起來,将L2的元素依次加入L1,代碼如下:

-module(lists_concat).
-export([concat/2,reverse/1,rconcat/2]).

%%函數reverse将清單逆置
reverse(L) -> reverse(L,[]).

reverse([],L) -> L;
reverse([H|T],L) -> reverse(T,[H|L]).

concatenate(L1,L2) -> concat(L1,reverse(L2)).

concat(L,[]) -> L;
concat(L,[H|T]) -> concat([H|L],T).
           

練習5:快速排序。

這個快排在教材中有提到,網上也有很多,可以借鑒,主要是用到了清單的連接配接、清單解析等操作,此題不解釋,代碼如下:

-module(quick_sort).
-export([qsort/1]).

qsort([]) -> [];
qsort([Pivot|T]) ->
    qsort([X||X <- T,X < Pivot])
    ++[Pivot]++
    qsort([X||X <- T,X >= Pivot]).
           

本節主要通過5個基本的聯系讓我們對Erlang的實戰進行了一定程度的認識,接下去我還會有大概10幾個練習的專題來學習讨論Erlang,我覺得從小練習與試驗中學習不僅能學到知識,更重要的是因為興趣而快樂,因為快樂而充實。(注:由于個人能力有限,有些地方難免繁瑣或者有疏漏,不吝賜教。)

注:如無特殊說明,本部落格内容純屬原創,轉載請注明:http://www.cnblogs.com/itfreer/ | IT閑人,謝謝!