第 7 章:列表与递归处理

对子保存固定的两部分数据。如果要保存数量不固定的一组整数,可以使用列表。本章创建列表 [2, 3, 5],然后计算其中所有元素的和。

创建列表

整数列表的类型是 「列」于「整数」。把 「整数」 换成 「字符串」,就得到字符串列表的类型。同一个列表中的元素需要符合相同的元素类型。

常用的列表写法如下:

「数列」乃「列」于「整数」也。
「数列」者(「列」【「二」,「三」,「五」】)也。

【】 内用中文逗号分隔元素。空列表可以写成 「罄」

列表由什么组成

处理列表时,只需要区分两种情况:

例如 [2, 3, 5] 的头是 2,尾是 [3, 5]。尾仍然是列表,只有一个元素的列表,其尾是空列表。「缀」 也能用于创建列表,例如 「缀」于「二」于「罄」 创建只含 2 的列表。日常列举元素时,使用前面的 【】 写法更方便。

完整程序:逐项求和

寻观「标准库」之书。

「列求和」乃化(「列」于「整数」)而「整数」也。
「列求和」者会「数列」而
    鉴「数列」而
        有「罄」则「零」
        或有(「缀」于「头」于「尾」)则
            「加」于「头」于(「列求和」于「尾」)也。

「数列」乃「列」于「整数」也。
「数列」者(「列」【「二」,「三」,「五」】)也。

「打印行」于(「整数表示」于(「列求和」于「数列」))。

输出为 10。这个函数在定义中调用了自己,称为递归。它先处理当前的头元素,再用相同方法处理尾列表。

可以把计算展开为下面几步。这里的方括号是解释用的数学记法:

求和 [2, 3, 5] = 2 + 求和 [3, 5]
求和 [3, 5]    = 3 + 求和 [5]
求和 [5]       = 5 + 求和 []
求和 []        = 0

从最后一步往回代入,就得到 2 + 3 + 5 + 0 = 10。每次递归都少处理一个元素,空列表分支负责停止。

练习

把数列改成空列表,结果应为 0;改成只含 7 的列表,结果应为 7。然后仿写 「列长度」:空列表返回零,非空列表返回“一加尾列表的长度”。对 [2, 3, 5] 应得到 3,而不是元素之和。

下一章会介绍接收函数的标准库操作,避免每次遍历列表都重写递归。

上一章 · 下一章:把函数作为参数 · 目录