W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
由于恒定性,Elixir中的環(huán)(與其他函數(shù)式編程語(yǔ)言一樣)和命令式語(yǔ)言中的寫(xiě)法是不同的。例如,C語(yǔ)言中的寫(xiě)法是這樣的:
for(i = 0; i < sizeof(array); i++) {
array[i] = array[i] * 2;
}
上述例子中,我們更改了數(shù)組和變量i。在Elixir中是不可更改的。所以函數(shù)式語(yǔ)言中以遞歸來(lái)替代:一個(gè)函數(shù)被反復(fù)調(diào)用,直到情況達(dá)到停止條件。在這個(gè)進(jìn)程中沒(méi)有數(shù)據(jù)被改變。思考下面的例子,一個(gè)字符串被打印任意次:
defmodule Recursion do
def print_multiple_times(msg, n) when n <= 1 do
IO.puts msg
end
def print_multiple_times(msg, n) do
IO.puts msg
print_multiple_times(msg, n - 1)
end
end
Recursion.print_multiple_times("Hello!", 3)
# Hello!
# Hello!
# Hello!
與?case
?類似,一個(gè)函數(shù)可以擁有許多從句。當(dāng)傳遞來(lái)的參數(shù)與從句的參數(shù)模式相匹配并且其衛(wèi)語(yǔ)句返回值為真,那么特定的從句就會(huì)被執(zhí)行。
第一個(gè)從句的守衛(wèi)說(shuō)道“當(dāng)且僅當(dāng)n
小于或等于1
時(shí)使用這個(gè)定義”。由于不符合這個(gè)情形,Elixir繼續(xù)到下一個(gè)從句定義。
第二個(gè)定義匹配模式成功,并且沒(méi)有守衛(wèi),所以被執(zhí)行了。它先打印了我們的msg
然后調(diào)用了他自己并傳遞了參數(shù)n-1 (2)
。
我們的msg
再次被打印,print_multiple_times/2
也再次被調(diào)用,這一次第二個(gè)參數(shù)被設(shè)置成了1
。由于n
已經(jīng)被設(shè)置成1
了,print_multiple_times/2
的第一個(gè)定義中的衛(wèi)語(yǔ)句執(zhí)行結(jié)果為真,所以我們執(zhí)行了這個(gè)定義。msg
被打印同時(shí)沒(méi)有額外的語(yǔ)句需要執(zhí)行了。
我們這樣定義print_multiple_times/2
,無(wú)論第二個(gè)參數(shù)是什么數(shù)字,它不是觸發(fā)了我們的第一個(gè)定義(被稱為基本案例),就是觸發(fā)了我們的第二個(gè)定義,并向基本案例更近了一步。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: