- Elixir 教程
- Elixir - 主页
- Elixir - 概述
- Elixir - 环境
- Elixir - 基本语法
- Elixir - 数据类型
- Elixir - 变量
- Elixir - 操作员
- Elixir - 模式匹配
- Elixir - 决策
- Elixir - 弦乐
- Elixir - 角色列表
- Elixir - 列表和元组
- Elixir - 关键字列表
- Elixir - 地图
- Elixir - 模块
- Elixir - 别名
- Elixir - 功能
- Elixir - 递归
- Elixir - 循环
- Elixir - 可枚举
- Elixir - 流
- Elixir - 结构
- Elixir - 协议
- Elixir - 文件 I/O
- Elixir - 流程
- 长生不老药 - 印记
- Elixir - 领悟
- Elixir - 类型规格
- Elixir - Behave
- Elixir - 错误处理
- Elixir - 宏
- Elixir - 图书馆
- Elixir 有用资源
- Elixir - 快速指南
- Elixir - 有用的资源
- Elixir - 讨论
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。一旦发生这种情况,我们就得到结果。
让我们考虑另一个例子,逐个打印列表中的每个元素。为此,我们将利用列表的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)
当我们有一个空列表(结束条件)时,将调用第一个打印函数。如果不是,则将调用第二个打印函数,它将列表分为 2,并将列表的第一个元素分配给 head,将列表的其余元素分配给 tail。然后头部被打印出来,我们再次调用打印函数来处理列表的其余部分,即尾部。当上面的程序运行时,它会产生以下结果 -
Hey 100 452 true People