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,如果为 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)

当我们有一个空列表时调用第一个打印函数(结束条件)。 如果不是,则将调用第二个打印函数,它将列表分为 2,并将列表的第一个元素分配给 head,将列表的其余元素分配给 tail。 然后头部被打印出来,我们再次调用打印函数来处理列表的其余部分,即尾部。 当上面的程序运行时,它会产生以下结果 −

Hey
100
452
true
People