Erlang 九 遞迴函式

2021-10-09 04:14:27 字數 2056 閱讀 6594

詳解

假設 函式a 是個遞迴函式,當我們在外部呼叫 函式a 時,在函式a在滿足條件的情況下會一直自己呼叫自己

簡單的說:函式自己呼叫自己

我們在超市買了一些東西,當去櫃檯結賬時,通過呼叫模組的函式 計算出商品的總**

items=[

,,].

%% 結賬模組 price.erl

-module

(price).

-export()

.%% 單個商品對應的**

itemprice

(orange)-

>

0.5;

itemprice()

->1;

itemprice

(pear)-

>

0.8;

%% 遞迴函式1

%% 只要傳遞進來的列表中,有乙個商品,就匹配成功

%% |--一種商品--||--剩餘商品--| |---計算該商品消費金額----| |--遞迴呼叫,計算剩餘商品**--|

sum([|

itemlist])

->

itemprice

(item)*

itemnum

+sum

(itemlist);

%% 遞迴函式2

%% 如果傳遞進來的列表是個空列表,函式執行結束

sum(

)->

0.

>

erl>c(

price).

>

price

:sum([

,,])

.16.8

我們詳細分解下遞迴函式的呼叫

在erlangshell中呼叫時,函式是怎麼執行的

%% 從上往下對函式 sum 進行模式匹配

%% 第乙個函式匹配成功:sum([|itemlist])

sum([|

,,])

)->

%% 這裡只是單純的計算**

itemprice

(orange)*

4%% 橘子2元

%% 遞迴呼叫,計算下乙個商品的**

+sum([

,]).

%% 第一次遞迴呼叫

%% 從上往下對函式 sum 進行模式匹配

%% 第乙個函式匹配成功:sum([|itemlist])

sum([|

]))-

>

%% 這裡只是單純的計算**

itemprice()

*10%% 蘋果10元

%% 遞迴呼叫,計算下乙個商品的**

+sum([

]).%% 第二次遞迴呼叫

%% 引數:

%% 從上往下對函式 sum 進行模式匹配

%% 第乙個函式匹配成功:sum([|itemlist])

%% item=pear,itemnum=6,itemlist =

sum([|

]))-

>

%% 這裡只是單純的計算**

itemprice

(pear)*

6%% 梨4.8元

%% 遞迴呼叫,計算下乙個商品的**

+sum([

]).%% 第三次遞迴呼叫

%% 引數:

%% 從上往下對函式 sum 進行模式匹配

%% 第乙個函式匹配失敗

%% 第二個函式匹配成功

sum(

)->

0.%% 最終結果

%% 外部呼叫時得到:橘子2元

%% 第一次遞迴呼叫得到:蘋果10元

%% 第二次遞迴呼叫得到:梨4.8元

%% 第三次遞迴呼叫得到:結束

sum([|

,,])

)->

橘子2元 + 蘋果10元 + 梨4.8元 +

0.

Erlang高階函式 遞迴

說明 erlang 高階函式 匿名函式 有一大堆資料,不再贅述,這裡主要說以下高階函式遞迴式。高階函式遞迴用法 高階函式實現尾遞迴有兩種方式 1 將高階函式自身作為引數傳入,並在內部呼叫 2 通過fun進行類似普通函式的定義 1 作為引數傳入 參考資料 erlang匿名函式的遞迴 寫普通函式的時候函...

Erlang匿名函式的遞迴

使用或者返回乙個匿名函式的函式被稱為高階函式 higer order function 普通的函式,它們遞迴是容易編寫的,因為它們有個名字,你引用這個名字就可以了,而匿名函式沒有名字,如何編寫遞迴呢?例子 下面是乙個計算乙個list的累加和的匿名函式 f fun this,total total t...

erlang雜記十二 再說尾遞迴

翻了一下list模組,看的時候,突然發現,尾遞迴其實是很容易展開成迴圈的。想起讀書時剛開始學程式,c語言,一直再糾結的乙個問題,就是如何讓乙個函式返回兩個引數的結果,哈哈,不要笑我。do sth sa,sb do sth ha ta la,hb tb lb,sa,sb do sth ta,tb,ha...