Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ### 为什么编号应该从0开始
- 当我们想表示自然数的一个子序列2,..., 12但又想去掉那有毒的三个点(省略号)的时候,
- 我们通常有以下四种比较公认的选择:
- a) 2 <= i < 13
- b) 1 < i <= 12
- c) 2 <= i <= 12
- d) 1 < i < 13
- 那么,在这四种选择中,我们应该有所偏好吗(认为一种比另一种更好吗)?答案是:是的!
- 观察一下可以发现,a和b中,右边界减去左边界刚好等于这个子序列的长度;同样的,基于
- 之前的观察结果我们可以得出,当存在两个相邻的子序列的时候,a和b两种表示方式,左边
- 子序列的右边界就是右边子序列的左边界。以上结论可以让我们排除掉c和d,但是在a和b
- 之间,我们还是无法做出选择,所以我们继续观察。
- 自然数是存在一个最小值的(fyi, 自然数包括0和正整数,左边界为0),如果采用b或者d的
- 这种不包含左边界的表示方式的话,当自然数序列里包含0的话,这个表示方式里就必然会
- 出现非自然数(e.g. 0, ..., 5, 用b或者d的表示方式的话就必须是-1 < i..blahblah)。这
- 种表示方式是很丑陋的,所以相对而言,我们更应该使用a或者c这种包含左边界的表示方式。
- 结合之前的推理结果(我们希望右边界减去左边界刚好等于子序列长度),如果一个序列从0
- 开始,而我们的表示里又包含了右边界的话,那我们就不得不将左边界定为-1(否则右边界
- 减去左边界就不等于序列长度了)。这样的表示方法同样是很丑陋的,所以综上,我们应该
- 采用a的这种表示方法。(with all due respect to Prof. Dijkstra,个人感觉最后一步没
- 啥推理的必要啊,上面两步已经能说明a方式最好了XD)
- <u>短评</u> 在Xerox PARC上开发出来的编程语言Mesa,事实上对上面提到的4中表示方式
- 都有对应的语法支持。本人通过对于Mesa的丰富的使用经历,发现后三种表示方式通常都是
- 粗陋的代码表达和bug的来源。基于之前的经历,我强烈建议Mesa的开发人员使用第一种表达
- 方式。我专门提一下这些经历,不管它有没有用,至少如果有人质疑我上面的那些结论没有
- 经过实践证实的话,这些通过实践得来证据可以证明。 (短评结束)
- 当我们希望处理一个长度为N的序列,而且希望通过下标来访问它的元素的时候。下一个让人
- 烦恼的问题就会是,它的第一个元素的下标应该是什么。秉承着我们上面推断出的a表达方式,
- 如果下标从1开始的话,这个序列的范围可以表示为 1 <= i < N+1; 但是如果下标从0开始的
- 话,我们事实上可以得到一个更加优雅的表达方式 0 <= i < N。所以就让我们用0作为第一
- 个下标吧:这样任意一个元素的序数(下标)就等于序列里该元素前面的元素个数。这个故事
- 的功德在于,经过了这好几百年的争吵,我们终于可以有更好的关注点了。—— 0作为最自然
- 的数字来充当序列的开头。
- <u>短评</u> 许多程序设计语言在设计的时候都没有足够关注这个细节。在FORTRAN语言里,
- 下标始终从1开始; 在ALGOL 60和PASCAL语言里,采用的是c表达方式; 更近一些的SASL语言
- 又回到了原来FORTRAN的那种表达方式: SASL语言里的一个序列,同时也是正整数的一个函
- 数。真是可惜!(正整数的函数意味着下标必定至少从1开始) (短评结束)
- 上面这些话是因为发生了这件事我才有感而发:我大学里一个数学系的同事——不是计算科学
- 家哦,他因为情绪失控,骂一群年轻的计算科学家迂腐,瞎卖弄学问。就因为他们习惯从0开
- 始计数。这个同事把有意识的选择最符合逻辑的表达方式当做了一种挑衅。(同样的,他还觉
- 得"End of..."这种习惯性表达当做挑衅; 但是这种习惯性表达事实上是很有用的,我听说之
- 前有一个学生,就因为觉得卷子上的题目第一页做到底就算做完了(而不是把End of...当做
- 题目的结尾),导致一次考试差点挂科了)。我觉得Antony Jay那句话说的很对:"在宗教和其
- 他类似事物的认同过程中,一定要铲除异教徒。不见得是觉得他们可能错了,反而是在担心
- 他们可能是对的"。
- Plataanstraat 5 11 August 1982
- 5671 AL NUENEN prof.dr. Edsger W. Dijkstra
- The Netherlands Burroughs Research Fellow
Add Comment
Please, Sign In to add comment