Erlang高階函式 遞迴

2021-09-10 17:45:58 字數 1147 閱讀 5420

說明

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作為函式的名稱,下圖為乙個...