Elixir 遞歸中的環(huán)

2023-12-15 13:45 更新

由于恒定性,Elixir中的環(huán)(與其他函數(shù)式編程語言一樣)和命令式語言中的寫法是不同的。例如,C語言中的寫法是這樣的:

for(i = 0; i < sizeof(array); i++) {
  array[i] = array[i] * 2;
}

上述例子中,我們更改了數(shù)組和變量i。在Elixir中是不可更改的。所以函數(shù)式語言中以遞歸來替代:一個函數(shù)被反復(fù)調(diào)用,直到情況達(dá)到停止條件。在這個進(jìn)程中沒有數(shù)據(jù)被改變。思考下面的例子,一個字符串被打印任意次:

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?類似,一個函數(shù)可以擁有許多從句。當(dāng)傳遞來的參數(shù)與從句的參數(shù)模式相匹配并且其衛(wèi)語句返回值為真,那么特定的從句就會被執(zhí)行。

第一個從句的守衛(wèi)說道“當(dāng)且僅當(dāng)n小于或等于1時使用這個定義”。由于不符合這個情形,Elixir繼續(xù)到下一個從句定義。

第二個定義匹配模式成功,并且沒有守衛(wèi),所以被執(zhí)行了。它先打印了我們的msg然后調(diào)用了他自己并傳遞了參數(shù)n-1 (2)。

我們的msg再次被打印,print_multiple_times/2也再次被調(diào)用,這一次第二個參數(shù)被設(shè)置成了1。由于n已經(jīng)被設(shè)置成1了,print_multiple_times/2的第一個定義中的衛(wèi)語句執(zhí)行結(jié)果為真,所以我們執(zhí)行了這個定義。msg被打印同時沒有額外的語句需要執(zhí)行了。

我們這樣定義print_multiple_times/2,無論第二個參數(shù)是什么數(shù)字,它不是觸發(fā)了我們的第一個定義(被稱為基本案例),就是觸發(fā)了我們的第二個定義,并向基本案例更近了一步。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號