01 · 自然数:零、后继与递归
自然数:零、后继与递归¶
把每个自然数表示成零或某个数的后继,并直接从两种情形实现相等和加法。
阅读本章前
你已经知道运算符会调用特殊方法,装饰器会在方法返回后记录消息。
完成本章后,你可以
- 用自己的话说明“自然数:零、后继与递归”中的数学定义
- 指出定义在 Python 数据中的表示方式
- 根据实际实现预测一段小规模执行过程
数学定义
零与后继属于皮亚诺公理的出发点;`n + 0 = n` 和 `n + S(m) = S(n + m)` 是加法的递归定义,不是新的公理。
数据表示
`pre=None` 表示零,`pre=n` 表示 `S(n)`。所以 2 存成 `S(S(0))` 的前驱链,而不是字段中的 Python 整数 2。
Python 实现
`0` / `S(n)` → `NaturalNumber.pre`; recursive addition → `__add__`
与本章一起阅读的实现和测试
数学定义
数学定义¶
零与后继属于皮亚诺公理的出发点;n + 0 = n 和 n + S(m) = S(n + m) 是加法的递归定义,不是新的公理。
数据表示
数据表示¶
pre=None 表示零,pre=n 表示 S(n)。所以 2 存成 S(S(0)) 的前驱链,而不是字段中的 Python 整数 2。
Python 实现
Python 实现¶
__eq__ 区分零与后继并递归比较前驱;__add__ 的两个分支逐字对应加法的基例和递归式。
本课程使用的精确对应关系:
执行过程
执行过程¶
计算 2 + 2 时,右操作数被逐步缩小到零。调用返回时先记录基例,再记录两层递归。
运行前预测
运行前写出基例日志、最后一条递归日志和最终值。
实验 · 自然数:零、后继与递归
尚未运行
⌘ / Ctrl + Enter
输出
请先写下预测,再运行。
用测试核对
用测试核对¶
测试分别命名零不是后继、后继的单射性和两条加法定义。有限测试不能代替归纳证明。
适用范围
适用范围¶
一元前驱链能清楚显示结构,但时间和空间随数值增长,只适合小输入。