为什么计数要从零开始?

为什么应该从 0 开始计数?

要避免使用可恶的省略号来表示自然数子序列 2、 3、 ……、12,通常有四种表达方式:
a) 2 ≤ i < 13
b) 1 < i ≤ 12
c) 2 ≤ i ≤ 12
d) 1 < i < 13

有理由证明其中的一种比其它的更好吗?答案是肯定的。根据观察表达方式, a) 和 b) 更有优势,因为它们边界的差值,刚好和子序列的长度一致。所以观察结果说明,采用上述两种表达方式的两个相邻子序列,其中一个的上边界和另一个的下边界是相等的。这个观察是合理的,但却不能帮助我们选择 a) 还是 b)。所以我们要重新开始分析。

存在一个最小的自然数。如果不包含下边界 —— 比如 b) 和 d),一个以最小自然数开始的子序列,其下边界将不得不进入非自然数的范围。这样会很丑陋,所以从下边界的角度来看,我们偏向于 a) 和 c)。现在,考虑从最小自然数开始的子序列:当序列收缩为一个空值时,包含上边界也会变得很不自然。这也是丑陋的,从上边界的角度考虑,如 a) 和 d) 中采用的 < 会更合适。这样我们可以得出一个结论,a) 相对来说一种更好的方式。

备注:施乐帕克研究中心(Xerox PARC)开发的语言 Mesa 对上述四种常用的整数表示法都有特殊的标示符。Mesa 上的众多经验表明,其它三种表示法是程序异常之源,所以 Mesa 程序员现在强烈建议不要使用后面三种可用的表达方式。我之所以提到这个经验证据,是因为如果没有实践的证明,会有些人不信服上述的结论。(备注结束)

* *
*

当处理一个长度为 N 的序列,我们希望能用下标来区分每个元素,另外一个难题是起始元素的下标如何赋值。支持方式 a) 的人认为从下标 1 开始,下标的的范围是 1 ≤ i < N+1;但是如果从 0 开始,会有更好的取值范围 0 ≤ i < N。所以我们采用序数 0 作为开始:一个元素的序号(下标)等于序列中位于它前面的元素个数。这个故事的寓意是,经过这几个世纪后,我们最好把 0 当成是一个最自然的数字。

备注:许多程序语言在设计时并没有关注这个细节。如 FORTRAN 的下标是从 1 开始的;ALGOL 60 和 PASCAL 采用的 c) 的形式。最近的 SASL 也遵循 FORTRAN 的惯例:SASL 的一个序列,同时也是一个正整数函数。太遗憾了!(备注结束。)

* *
*

上面的内容是由最近一件事件所引发的,那是一次情感的大爆发,我大学里的一位数学系同事(不是计算机科学家),他指责年轻的计算机科学家“卖弄学问”,因为他们习惯从 0 开始计数。他故意挑选最合理的惯例来挑衅。(以“…结束”的惯例确实很具挑衅性,但这种惯用方式很有用:我知道某一个学生差点没通过考试,就是因为他默认第一页的底部就是问题的结束位置。),我认为 Antony Jay 的声明是对的:“在其它类似的领域中,极端主义者通常会被轰走,这不是因为他可能是错的,而是因为他可能是对的。”

 

Plataanstraat 5
5671 AL NUENEN
The Netherlands
11 August 1982
prof.dr. Edsger W. Dijkstra
Burroughs Research Fellow
4 6 收藏 2 评论

关于作者:刘晓鹏

大道至简 个人主页 · 我的文章 · 17

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部