說明
erlang 高階函式(匿名函式)有一大堆資料,不再贅述,這裡主要說以下高階函式遞迴式。
高階函式遞迴用法
高階函式實現尾遞迴有兩種方式:
1、將高階函式自身作為引數傳入,並在內部呼叫
2、通過fun進行類似普通函式的定義
1、作為引數傳入
參考資料: ***erlang匿名函式的遞迴
寫普通函式的時候函式名確定(是原子),因此可以在函式內部呼叫自身,從而實現尾遞迴。但高階函式不同,高階函式在定義出來之前是未知的。所以通常情況下都是在定義時多傳乙個引數,在使用的時候將已經定義的函式自身傳入。
示例**:
fun = fun
(f, , total) ->
total;
(f, [h|t], total) ->
f(f, t, h+total)
end.
2、類似普通函式進行定義
這是群裡的朋友交流的時候 @冰川 提出來的,在此之前還真不知道有這種用法。
曾經想過可能會有,但再想到這種用法和erlang的一貫做法不搭,就自我否定了。有沒有是一回事兒,是否求證是另一回事兒,現在看來真是慚愧。
示例**:
f = fun
test([h | t], total) ->
test(t, h + total);
test(, total) ->
total
end.
注:上面的用法怎麼看都是物件導向,當然跟函式指標的用法也很像
執行結果:
erlang/otp 20 [erts-9.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
eshell v9.0 (abort with ^g)
1> f = fun test([h | t], total) -> test(t, h + total); test(, total) -> total end.
#fun2> f([1,2,3,4,5,6,7,8], 0).
363>
**: Erlang 九 遞迴函式
詳解假設 函式a 是個遞迴函式,當我們在外部呼叫 函式a 時,在函式a在滿足條件的情況下會一直自己呼叫自己 簡單的說 函式自己呼叫自己 我們在超市買了一些東西,當去櫃檯結賬時,通過呼叫模組的函式 計算出商品的總 items 結賬模組 price.erl module price export 單個商...
Erlang匿名函式的遞迴
使用或者返回乙個匿名函式的函式被稱為高階函式 higer order function 普通的函式,它們遞迴是容易編寫的,因為它們有個名字,你引用這個名字就可以了,而匿名函式沒有名字,如何編寫遞迴呢?例子 下面是乙個計算乙個list的累加和的匿名函式 f fun this,total total t...
Erlang匿名函式及函式的高階應用
erlang 作為一種函式式程式語言,和其他的函式式程式語言一樣具有lambda函式,在erlang中也稱為匿名函式,同時函式也可以賦值給變數或作為引數進行傳遞,此處對erlang 中的匿名函式及級高階應用作簡要介紹。一 匿名函式 erlang 中匿名函式在定義時使用fun作為函式的名稱,下圖為乙個...