递归 才是处理列表的最佳工具。
头部和尾部
列表可以通过管道运算符 |
来分隔头部和尾部。
1 | iex> [head | tail] = [1, 2, 3] |
- 空列表长度为
0
- 列表长度等于列表尾部长度 + 1
递归计算列表长度
1 | defmodule Demo do |
1 | iex> Demo.len [1,2,3,4,5] |
head变量没有被用到,可以使用_开头的变量名来消除编译警告(_head)。
## 创建映射函数
1 | defmodule Demo do |
_func 没有被使用,所以_开头
1 | iex> Demo.len [1,3,4,5], &(&1*10) |
方便对列表进行操作。
递归时跟踪值
列表求和:
1 | defmodule Demo do |
1 | iex> Demo.sum [1,2,3,4,5] |
- 第一
defp
来定义私有函数 - 第二给辅助函数取和公开函数一样的名称,但以
_
开头。
更复杂的列表
不是所有的列表问题都可以简单的一次处理一个元素来解决,幸好我们有连接运算符 |
,左边允许有多个值。
1 | defmodule Demo do |
1 | iex(37)> Demo.swap [1,2,3,4,5,6] |
raise 抛出一个异常,相当于 java 的 throw
对不关心的域使用 _ 占位符