原文:Why numbering should start at zero by Edsger Dijkstra
表示自然數(shù)2,3,...,12的數(shù)列時中間三個點實在是礙眼,我們應(yīng)該可以想到四種表記文法拿掉它們:
a) 2 ≤ i < 13
b) 1 < i ≤ 12
c) 2 ≤ i ≤ 12
d) 1 < i < 13
是否有理由認為其中一種是最優(yōu)雅的呢?是的,確實有??疾靉)和b)發(fā)現(xiàn)它們具有以下優(yōu)點:邊界之間的差正好等于所提及的數(shù)列的長度,這一結(jié)果是有說服力的。因此,考察結(jié)論是,在任一文法中,兩個數(shù)列相鄰意味著一個數(shù)列的上限等于另一個的下限。由于這些考察是有說服力的,她們讓我們無法在a)與b)之間作出選擇;故而我們換一種方法?,F(xiàn)在考慮從最小
假設(shè)有一個最小自然數(shù)。像b)和d)那樣排除下界的做法迫使一個從最小自然數(shù)開始數(shù)列如前所述的下界被擠到非自然數(shù)范圍里。那相當(dāng)不雅觀,所以在下界的處理上,我們更希望是a)和c)里的≤的做法。現(xiàn)在考慮從最小自然數(shù)開始的數(shù)列:在數(shù)組收束為空數(shù)組,包含上界讓下界的存在變得多余尷尬。那相當(dāng)不雅觀,所以在上界的處理上,我們更希望是a)和d)里的做法。我們的結(jié)論是a)最受青睞。
備注 產(chǎn)生于Xerox PARC的編程語言Mesa對所有四種文法都有特定記號表示。Mesa程序員的大量經(jīng)驗已經(jīng)表明另外三種文法的用法一直是苦手和錯誤的根源,出于這種體會,Mesa程序員現(xiàn)在強烈建議不要使用后三個功能。我曾今提到這個實驗證明—她價值何在—因為有些人對在實踐中尚未得到證實的結(jié)論感到糾結(jié)。(備注結(jié)束)
處理長度為N的數(shù)列時,我們希望通過下標(biāo)區(qū)分其中的元素,下面煩人的問題是分配給她起始元素的下標(biāo)值。按照文法a),假如下標(biāo)從1開始,其取值范圍是1 ≤ i < N+1;然而下標(biāo)從0開始給出了更為優(yōu)雅的取值范圍0 ≤ i < N。因此我們可以讓所有的序號從0開始:一個元素的序號(下標(biāo))等于同序列中她前面的元素數(shù)。這個論述的意義在于我們應(yīng)該將0視為最自然的數(shù)字—有生之年。
備注 許多編程語言沒有對此細節(jié)予以足夠的重視。在FORTRAN中下標(biāo)一直是從1開始的;在ALGOL 60和PASCAL中,它們都采用了文法c);最近的SASL已經(jīng)回到了FORTRAN文法的懷抱:事實上,SASL中的序列同時也是正整數(shù)上的功能。好可憐?。。▊渥⒔Y(jié)束)