头部与尾部
了解 head、tail 的概念,以及如何利用它们来处理列表。
当我们使用传统编程语言处理列表时,通常会将其视为需要遍历的对象,因此循环遍历显得非常自然。那么,为什么我们还要专门用一章来讲解列表和递归呢?因为如果我们以正确的方式看待问题,递归正是处理列表的完美工具。
头部与尾部
之前我们提到,一个列表要么为空,要么由一个“头”(head)和一个“尾”(tail)组成。“头”包含一个值,“尾”本身也是一个列表。这是一个递归定义。我们将空列表表示为:[ ]。假设我们可以用竖线符号 | 来表示“头”和“尾”的分隔。我们通常写作 [3] 的单元素列表,可以表示为值 3 与空列表连接的结果:[3|[]]。
再来看列表 [2, 3]。它的“头”是 2,“尾”是仅包含 3 的单元素列表。因此,我们可以将 [2,3] 写作 [2 | [3|[]]]。
处理列表
我们可以将一个值和一个列表组合起来,构成一个新的列表,其中该值作为新列表的“头”,原列表作为新列表的“尾”。
那么,为什么在讲完模块和函数之后还要讨论列表呢?因为列表和递归函数就像鱼和薯条一样天作之合。让我们来看看如何计算列表的长度。
- 空列表的长度是
0。 - 一个列表的长度是
1加上其“尾”部分的长度。
在 Elixir 中编写计算列表长度的算法非常简单。请在下方终端中输入 MyList.len([1,2,3,4,5]) 命令。我们可以尝试用不同的输入测试 len() 函数。
No configuration found for ID: 0bcc2c33031a9f0120e27ef7eb15364f39599b761a4044d6150308aae9ca26e7
构建列表
让我们再进一步挑战一下。编写一个函数,接收一个数字列表,并返回一个新的列表,其中每个元素都是原列表对应元素的平方。
请在下方终端中输入 SecondList.square([1,2,3,4,5]) 命令。
No configuration found for ID: 11d151aae1cb59f4e31c129efb7d44e1673dd036f4e50b39e4b3e455a04d97c6
当我们匹配一个非空列表时,返回的新列表的“头”是原列表“头”的平方,而“尾”则是原列表“尾”中各元素平方后组成的新列表。