标签:
网址:http://blog.jobbole.com/95826/
为什么应该从 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 的声明是对的:“在其它类似的领域中,极端主义者通常会被轰走,这不是因为他可能是错的,而是因为他可能是对的。”
标签:
原文地址:http://www.cnblogs.com/abapscript/p/5045464.html