Elixir - 遞迴



遞迴是一種方法,其中問題的解決方案取決於相同問題較小例項的解決方案。大多數計算機程式語言透過允許函式在程式文字中呼叫自身來支援遞迴。

理想情況下,遞迴函式具有一個結束條件。這個結束條件,也稱為基本情況,停止重新進入函式並將函式呼叫新增到堆疊中。這是遞迴函式呼叫停止的地方。讓我們考慮以下示例以進一步瞭解遞迴函式。

defmodule Math do
   def fact(res, num) do
   if num === 1 do
      res
   else
      new_res = res * num
      fact(new_res, num-1)
      end
   end
end

IO.puts(Math.fact(1,5))

執行上述程式時,會生成以下結果:

120

因此,在上述函式 Math.fact 中,我們正在計算一個數的階乘。請注意,我們在函式內部呼叫了函式本身。現在讓我們瞭解它是如何工作的。

我們為它提供了 1 和我們想要計算其階乘的數字。該函式檢查數字是否為 1,如果是則返回 res (結束條件)。否則,它建立一個變數 new_res 並將其值賦為先前 res * 當前 num。它返回函式呼叫 fact(new_res, num-1) 返回的值。這會重複,直到我們得到 num 為 1。一旦發生這種情況,我們就會得到結果。

讓我們考慮另一個示例,逐個列印列表中的每個元素。為此,我們將利用列表的 hdtl 函式以及函式中的模式匹配:

a = ["Hey", 100, 452, :true, "People"]
defmodule ListPrint do
   def print([]) do
   end
   def print([head | tail]) do 
      IO.puts(head)
      print(tail)
   end
end

ListPrint.print(a)

當我們有一個空列表時,第一個 print 函式被呼叫 (結束條件)。否則,將呼叫第二個 print 函式,該函式將列表分成兩部分,並將列表的第一個元素分配給 head,將列表的其餘部分分配給 tail。然後列印 head,我們再次使用列表的其餘部分(即 tail)呼叫 print 函式。執行上述程式時,會產生以下結果:

Hey
100
452
true
People
廣告