Erlang 基礎程式設計套路

2021-08-18 08:49:00 字數 1786 閱讀 6992

有一段時間沒有寫 erlang 程式了,近日有個小夥伴要幫忙,給了我幾個小練習,讓我寫寫看。雖然寫得有點慢,畢竟還是完成了。突發靈感,erlang有沒有什麼「程式設計套路」呢?

初學 erlang 者大部分都感嘆「太逆天了」,個人認為,掌握erlang 程式設計邏輯兩個基本點就是模式匹配和遞迴思想。而遞迴思想在任何一種程式語言中都是存在的,也是解決問題最簡便的思維方式。

就著這個練習,其實之前好像也有過一次接受過類似問題的求助,對照我的思考總結一下:

習題如下:

格式化元組:

輸入:[,,,,,,,,card,4001,281479271678955}]

輸出:[,,]},,,]}]

我的**如下圖(此程式沒有對輸入資料格式的檢查):

其基本思想是對要解決的問題進行分類,分別編寫乙個子句,每個子句中的函式頭部括號中模式匹配部分(引數部分)就是描述解決複雜問題的一種情況的入口(當然,還可以輔之以保護式),而函式體則是解決這一種情況下的所有處理語句。這些處理語句又大致分為兩類:

1.可以直接返回處理結果。這也是程式執行結束的情況,或者用遞迴的思想看就是退出遞迴的條件。

比如本例中的第51行**:

format2() -> ;

當傳入要格式化的列表為空時,直接返回空的列表。

再如第54行**:

format2(,lb) -> lb;

元組列表中的元素全部處理完成後,直接返回結果列表。

而**中61-71行中的combb函式則每個子句都是處理一類問題,並直接返回處理結果的情況。

2.需要遞迴處理,以獲取最終結果。即經本輪處理後,要處理的問題減少了,但並沒有獲得最終結果,還是要經過多輪遞迴呼叫,將要處理的問題減少到0,即遞迴退出的條件,最終會返回結果。

本例**中的combine函式(55-59)中的57、58行就是這種情況:從55行的模式匹配就可以看出,通過模式匹配逐個處理輸入元組列表中的元組,只要沒有處理完,在57、58行中就會進行遞迴呼叫(此處正好對應在結果列表中可以找到有對應key和無對應key的兩種情況),每次遞迴呼叫就會處理掉所給列表中的乙個元組,直到處理完成後會通過模式匹配方式呼叫第54行的子句並返回處理結果。

再看我解決這個問題的另一版本:

第30行就是上文中說的第一種情況,第32行就是遞迴呼叫;comba函式(35-44)子句中,前三個子句都是處理可直接返回結果的,第四個子句(44行)則是遞迴呼叫,嘗試繼續匹配。

還有乙個套路補充下,就是通過增加函式的元數來接收處理結果。比如52行、58行、32行等。

最後,說明一下,寫 erlang 函式時還要注意模式匹配的順序,不要讓前面子句的模式匹配擋住了後面子句。原則就是先做特殊匹配,再做一般匹配。

下面再來個粟子:

查詢list1是為list2的字首

先將問題分類:

1.   兩個列表都為空,結果為是;

2.   前乙個列表為空,後乙個不為空,結果為是;

3.   前一列表不為空,後乙個為空,結果為否;

4.   兩個列表不為空,且第乙個元素相同,需要繼續查詢(遞迴呼叫);

5.   兩個列表不為空,且第乙個元素不同,結果為否。

對照下面的程式是不是就一目了然了呢?

不當之處,敬請斧正。

Flink batch stream程式設計套路

dataset and datastream 這裡以wordcount為例,共同的程式設計套路如下所示 1.獲取執行環境 execution environment final streamexecutionenvironment env streamexecutionenvironment.get...

Erlang程式設計01

erlang程式設計簡介 erlang程式設計 由人民郵電出版社出版發行 圖靈程式設計叢書 作者 joe armstrong 喬 阿姆斯壯 譯者 趙東煒 金尹 錄入 cenzige 詳細資訊 書名原文 programming erlang software for a isbn 978 7 115 ...

Erlang程式設計11

2.4 啟動shell 現在我們正式開始。shell是乙個互動工具,我們長用他來完成與erlang的互動。啟動shell隻後,我們可以輸入表示式,然後shell就會返回這些表示式的值。如果你已經安裝好了erlang,那麼erlang shell erl也就同時安裝好了。要執行他,請開啟乙個傳統的作業...