递归
优质
小牛编辑
131浏览
2023-12-01
递归是一种方法,其中问题的解决方案取决于对同一问题的较小实例的解决方案。 大多数计算机编程语言通过允许函数在程序文本中调用自身来支持递归。
理想情况下,递归函数具有结束条件。 此结束条件(也称为基本情况)会停止重新输入函数并向堆栈添加函数调用。 这是递归函数调用停止的地方。 让我们考虑以下示例来进一步理解递归函数。
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 (Ending condition) 。 如果没有,则它创建一个变量new_res并为其分配先前res *当前num的值。 它返回我们的函数调用fact(new_res, num-1)返回的值。 这一直重复,直到我们得到num为1.一旦发生这种情况,我们得到结果。
让我们考虑另一个例子,逐个打印列表的每个元素。 为此,我们将利用列表中的hd和tl函数以及函数中的模式匹配 -
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)
当我们有一个空列表(ending condition)时,将调用第一个打印函数。 如果没有,则将调用第二个打印函数,该函数将列表分成2,并将列表的第一个元素指定为head,将列表的剩余部分指定为tail。 然后打印头,我们再次使用列表的其余部分(即tail)调用打印功能。 运行上述程序时,会产生以下结果 -
Hey
100
452
true
People