1.1 整数加减法¶
引入¶
远古人类没有数字,只会结绳计数:数一样东西,就在绳子上打一个结。要知道两堆东西一共多少,最笨也最可靠的办法是——把两根绳子接起来,从头数一遍。
现在假设你比结绳先进一点点,但也只会一件事:从一个数,数到它后面紧挨着的那个数(1 后面是 2,2 后面是 3……)。仅凭这一个本事,你能不能算出 ?
能。 就是从 开始,往后接着数 个数。 数到哪里,哪里就是答案。这是历史上最古老的加法,也不需要背任何加法表。
加法¶
探索¶
拖一拖,观察:
上面条子变长 1 格,拼接后的总数怎么变?
这和"从 后面接着数 个"是不是同一件事?
解释¶
两个数字的加法,最简单的理解就是数一下图中两条长条拼在一起一共有多少格:先数完 条,不用停,接着往下数 个格子,数到的最后一个数,就是 。
这和探索环节滑杆上看到的完全一致:加法不是一个要背的规则,而是"接着数"这个动作本身。
代码例题¶
代码解释:for 循环跑了 b 次,每次都让 c 变成"它后面紧挨着的那个数"(c = c + 1)。跑完 b 次,c 正好是从 a 往后数了 b 步的结果——这正是引入里"从 a 接着数 b 个"的字面翻译,一步没多,一步没少。
减法¶
探索¶
拖一拖,观察:
长条退了 格之后,剩下的格数和 、 有什么关系?
如果退格是"加法倒着放",那减法的每一步应该让数怎么变?
解释¶
减法其实是加法反着做:加法是"数到后面紧挨着的那个数",减法就是数到前面紧挨着的那个数——退一格。已知 (加完之后的结果)和 (加了多少个),从 往回退 格,退到哪里,哪里就是 。
代码习题¶
提示:加法每一步是 c = c + 1(数后面一个);减法反过来,每一步应该是数前面一个。这里 a 记录当前数到的位置,把这一行补完,跑一跑,看 a 最后是不是变成了 3。
代码解释:a = c 先让 a 站在 c 所在的位置;这时的 a 还不是答案,只是一个正在往回走的数。循环每运行一次,a 就“退一格”;重复 次后,a 才走到真正的答案。这和加法用的是同一个技巧,只是方向反了过来。
数学小故事¶
100 多年前,意大利数学家皮亚诺(Giuseppe Peano)想把"自然数到底是什么"讲得清清楚楚,清楚到没有人能挑出一点毛病。他给自然数定的规则里,有一条是:每一个数,都有唯一一个"紧挨在它后面"的数。
这条规则不需要证明——数学家把这种"作为出发点、不用再解释为什么"的规则叫公理。皮亚诺就用这一条公理,把加法重新定义成:把"数下一个"这个动作,重复做 次。
这正是你在代码里写的 c = c + 1。你写的这个循环,和皮亚诺一百多年前用来打地基的想法,是同一件事。
练习题¶
沿着"接着数"的思路判断对错:
两堆东西一共有多少,先数哪一堆、再数哪一堆,总数都一样。
再判断一句:
三堆东西,不管先合并哪两堆,最后的总数都一样。
"减法就是倒着做的加法。"结合本课的两段代码,用你自己的话解释这句话对不对,为什么。