- 教程
- 概述
- 环境
- Basic 语法
- 数据类型
- 变量
- 运算符
- 模式匹配( Pattern Matching)
- 决策( Decision Making)
- Strings( Strings)
- Char Lists( Char Lists)
- 列表和元组( Lists and Tuples)
- 关键字列表( Keyword Lists)
- Maps
- 模块( Modules)
- 别名( Aliases)
- 功能( Functions)
- 递归
- 循环
- Enumerables( Enumerables)
- Streams( Streams)
- Structs( Structs)
- 协议 Protocols
- File I/O
- 进程( Processes)
- Sigils( Sigils)
- 理解( Comprehensions)
- Typespecs( Typespecs)
- 行为( Behaviours)
- 错误处理( Errors Handling)
- Macros( Macros)
- (库)Libraries
- 有用的资源
- 讨论
- Show 例子
- Show 例子
- Show 例子
- Show 例子
- Show 例子
- if statement
- if..else statement
- unless statement
- unless..else statement
- cond
- case
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
递归
递归是一种方法,其中问题的解决方案取决于对同一问题的较小实例的解决方案。 大多数计算机编程语言通过允许函数在程序文本中调用自身来支持递归。
理想情况下,递归函数具有结束条件。 此结束条件(也称为基本情况)会停止重新输入函数并向堆栈添加函数调用。 这是递归函数调用停止的地方。 让我们考虑以下示例来进一步理解递归函数。
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论