詳解
假設 函式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
我們詳細分解下遞迴函式的呼叫%% 從上往下對函式 sum 進行模式匹配在erlangshell中呼叫時,函式是怎麼執行的
%% 第乙個函式匹配成功: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...