跳转至

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__`

与本章一起阅读的实现和测试

peano/natural_number.py · tests/test_natural_number.py

数学定义

数学定义

零与后继属于皮亚诺公理的出发点;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__ 的两个分支逐字对应加法的基例和递归式。

本课程使用的精确对应关系:

`0` / `S(n)` → `NaturalNumber.pre`; recursive addition → `__add__`

执行过程

执行过程

计算 2 + 2 时,右操作数被逐步缩小到零。调用返回时先记录基例,再记录两层递归。

运行前预测

运行前写出基例日志、最后一条递归日志和最终值。

实验 · 自然数:零、后继与递归 尚未运行
⌘ / Ctrl + Enter
输出
请先写下预测,再运行。

用测试核对

用测试核对

测试分别命名零不是后继、后继的单射性和两条加法定义。有限测试不能代替归纳证明。

适用范围

适用范围

一元前驱链能清楚显示结构,但时间和空间随数值增长,只适合小输入。

关于“自然数:零、后继与递归”的实现,哪一种说法正确?