📜  Elixir-递归

📅  最后修改于: 2020-11-04 05:29:26             🧑  作者: Mango


递归是一种方法,其中问题的解决方案取决于相同问题的较小实例的解决方案。大多数计算机编程语言都通过允许函数在程序文本中调用自身来支持递归。

理想情况下,递归函数具有结束条件。这种结束条件(也称为基本情况)停止重新输入该函数并将函数调用添加到堆栈中。这是递归函数调用停止的地方。让我们考虑以下示例,以进一步了解递归函数。

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