为什么编号应该从零开始?

Published at 2022-08-04 13:20

Author:zhixy

View:450


下文翻译(部分地)自Dijkstra博士的手写稿

为了不用讨厌的三个点来表示自然数子序列2、3、...、12,我们有四个惯例:

有什么理由让我们更喜欢其中一个方式吗?

惯例1和2的优点是,上述界限之差等于子序列的长度。因此,在这两个表示惯例的约定下,两个子序列都是相邻的,也就是说一个子序列的上界等于另一个的下界。但这两种方式又该如何选择呢?

排除下边界——如惯例2和4——,强制让一个从最小自然数开始的子序列的下边界进入了非自然数域。这很丑陋,所以对于下界,我们更喜欢惯例1和3中的。现在考虑从最小的自然数()开始的子序列:当序列缩小到空序列时,包含上限将迫使惯例3不自然。这也很丑陋,所以对于上界,我们更喜欢惯例1和4中的。我们的结论是取公约数,即惯例1是首选。

Xerox PARC 开发的编程语言Mesa,在所有四个惯例中对整数区间都有特殊的符号。使用Mesa的经验表明,其他三个惯例一直是笨拙和错误的根源,由于这些经验,Mesa程序员现在被强烈建议不要使用后三个可用功能。

在处理长度为的序列时,我们希望通过下标区分其元素,下一个棘手问题是为其起始元素分配什么下标值。遵守惯例1,从下标1开始时,下标范围为;然而,从开始,给出更好的范围。因此,让我们的序数从零开始:元素的序号(下标)等于序列中它之前的元素数量。这个故事的寓意是,在经历了这么多世纪之后,我们最好将零视为一个最自然的数字。

许多编程语言的设计没有适当关注这些细节。在FORTRAN下标中,总是从1开始;在ALGOL 60和PASCAL中,惯例3已被采用;最近的SASL已经退回到FORTRAN公约:SASL中的序列同时是正整数上的函数。可惜!

上述情况是由最近的一起事件引发的,当时我在大学的一位数学家同事——不是计算科学家——指责一些年轻的计算科学家“卖弄学问”,因为他们习惯上从零开始编号。他有意识地将最明智的编号方式视为挑衅。我认为Antony Jay是对的,他说:“在公司宗教和其他宗教中,必须驱逐异教徒,不是因为他可能错了,而是因为他可能是对的。”

11 August 1982 prof.dr. Edsger W. Dijkstra Burroughs Research Fellow