elixir教程:递归和枚举

news/2024/11/16 11:56:21/

文章目录

    • 递归
    • 递归实现循环
    • 列表和尾递归
    • Enum模块

递归

由于在Elixir中,变量是不可变的,从而类似i++这种自增指令是没法实现的,也就没法进行循环。但作为一种编程语言来说,循环又是必不可少的一种流程控制手段,而在elixir中,实现循环的第一方法,就是递归。

递归,就是调用自身的函数,下面举一个简单的计算阶乘的例子

# Test.ex
defmodule Test dodef fac(n) when n <= 1 do1enddef fac(n) don*fac(n-1)end
end

测试结果如下

> Test.fac(5)
120

递归实现循环

想用递归实现循环,则至少需要有一个用于终止循环的标记,例如,若想打印所有小玉N的整数,用for循环写一个伪代码就是

for(i=0; i<=N; i++) print(i)

而在elixir中,若用递归来改写这个循环,则代码如下

# 在Test.ex的defmodule中添加下列内容
def printNum(i, n) doIO.puts iif i < n doprintNum(i+1, n)end
end

其运行结果为

iex(1)> Test.printNum(1,5)
1
2
3
4
5
nil

列表和尾递归

在介绍模式匹配时,也附带介绍了elixir中的一种键值对数据结构,即关键字列表、表单,这是因为模式匹配是elixir中最核心的一种编程理念。但对于普通程序员来说,列表显然要比关键字列表更为基础。

elixir中,列表的创建方式非常简单,只需用方括号框起来就可以,而且列表中不限定数据类型。

> lst = [1,2,"a","trump"]
[1, 2, "a", "trump"]

之所以在讲解循环的实现方式之后再着重介绍列表,是因为在某些语言中,是支持类似for ... in lst这种循环的,换言之,列表是一种天然的适合迭代的数据结构。

针对列表,有一种特殊的迭代方法,即尾递归,下面通过这种思路,实现一个数组求和函数

# 在Test.ex中添加下列内容
def sumList(lst) dosumList(lst, 0)
end# 尾递归函数
def sumList([head|tail], sumVar) dosumList(tail, head + sumVar)
enddef sumList([], sumVar) dosumVar
end

调用结果为

> Test.sumList([1,2,3,4])
10

Enum模块

尽管尾递归用起来并不复杂,但和直接迭代列表相比,仍然是比较复杂的。故而elixir提供了Enum模块,用于处理类似列表这种可枚举的数据结构,从而使得一行代码就可以进行列表求和

> Enum.sum([1,2,3,4])
10
> Enum.reduce([1,2,3,4], 0, &+/2)
10

Enum.sum相当于是封装好的求和函数,自然没什么好说的,但reduce却是另一种编程逻辑,相当于从0开始,逐次执行+这一二元操作,直到列表被迭代完成。

reduce相比,map可能更容易理解,相当于是把列表中的每个值抽取出来,然后逐个操作,并得到一个新的列表,下面是对列表中每个元素求平方

> Enum.map([1, 2, 3, 4], fn x -> x * 2 end)
[2, 4, 6, 8]

Enum中提供了一系列用于可迭代变量的函数

函数说明
min/max/sum最小值;最大值;求和
all?/any?条件判断
each/map遍历
filter按条件过滤
reduce
sort/uniq排序;去除重复值

其中,eachmap的区别,即前者并不产生新的值,后者产生新值,如果想打印列表中的所有值,就比较推荐Enum.each函数。

filter, all?, any?这三者所需要的函数,返回值应该都是布尔型,下面以erm(x,2)==0作为条件,分别测试一下这三个函数

iex(7)> Enum.filter([1, 2, 3, 4], fn(x) -> rem(x, 2) == 0 end)
[2, 4]
iex(8)> Enum.any?([1, 2, 3, 4], fn(x) -> rem(x, 2) == 0 end)
true
iex(9)> Enum.all?([1, 2, 3, 4], fn(x) -> rem(x, 2) == 0 end)
false

其中,any?的含义是,只要列表中有符合2的倍数的值,那么就返回trueall?则要求列表中所有值都是2的倍数,才返回true


http://www.ppmy.cn/news/583622.html

相关文章

帝国CMS7.5仿可可礼物网漂亮大气淘宝客网站源码 带手机版+火车头采集

简介&#xff1a; 帝国CMS 7.5 utf-8 PHPMYSQL淘宝客创意礼物在线导购网站源码&#xff0c;大型礼物类整站程序系统模板。 本模板清爽简单&#xff0c;同时可改成化妆品&#xff0c;女装&#xff0c;箱包类的淘宝客导购网&#xff0c;可以在文章攻略中插商品购买链接。 网盘下…

模仿唯品会官网静态

模仿唯品会界面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" …

巧用手机使用方法,关键时刻成为“救命草”

手机对于没人都不陌生&#xff0c;都知道手机能打电话发短信&#xff0c;现在的智能手机还能上网&#xff0c;看电视&#xff0c;视频&#xff0c;玩游戏&#xff0c;等等等好多的功能&#xff0c;但是大家基本忽略了手机的另外一个功能&#xff1a;就是手机能在你遇难的一刻成…

知+付费推广:我花3W烧出来的投放经验

互联网捡钱的时代已经过去了&#xff0c;初入这个行业就信步乾坤游戏人生的人&#xff0c;是极少极少数的。 你进来就是受苦踩坑&#xff0c;就是不断历练成长&#xff0c;接着爆发成为一把锋利的镰刀。 而大部分人&#xff0c;你给他再好的流量红利&#xff0c;项目风口&…

迈锐宝xl android auto,迈锐宝xl导航怎么连接手机

从广州到厦门 全新迈锐宝XL长途油耗测试 何为家庭实用型轿车&#xff1f;那是要既能满足日常上下班的需要&#xff0c;又能满足节假日自驾游的需求&#xff0c;重点还要省油。随着油价日渐上涨&#xff0c;人们对汽车的油耗表现越来越关注&#xff1b;而且国家对能耗和排放的要…

社交鼻祖人人网被卖 曾意气风发比肩Facebook 一代人的回忆终结了

今天&#xff0c;11月14日&#xff0c;人人公司获得多牛传媒设立的开曼公司发行的4000万美元的股份&#xff0c;而多牛传媒以2000万美元反向收购人人公司旗下人人网社交平台。 不知道有多少还记得人人网&#xff08;原来的校内网&#xff09;&#xff0c;如果你还记得&#xff…

android 2g内存,追求极致流畅体验 2G内存安卓手机推荐

【PConline 海选导购】无论是从机型数量还是市场占有率的角度来看&#xff0c;安卓手机无疑是现阶段智能手机的NO.1。需要注意的是&#xff0c;同样是搭载Android系统的手机&#xff0c;在使用体验上也有所差别。之所以出现这种情况&#xff0c;跟手机的具体软硬件配置以及厂商…

随着开发技术的发展,利用应用宝贝类的App制作平台

四家电子商务平台分析 在移动互联网时期&#xff0c;假设你没有自己的电商商店&#xff0c;那么对不起&#xff0c;你损失了一半的利润。电子商务已成为新时期营销的标准。许多新企业完好依赖电子商务。那么电商企业是怎样做的&#xff0c;是怎样从零开端学会做电商的&#xf…