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
广告