Elixir 遞歸中的環(huán)

2023-12-15 13:45 更新

由于恒定性,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è)定義,并向基本案例更近了一步。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)