為什麼計數應該從零開始?

火星人 @ 2014-03-12 , reply:0


  

眾所周知,C語言數組下標是從0開始,其它很多語言皆如此。而 FORTRAN 則是數組下標從1開始的典範。所以就有數組下標是從1開始好還是從0開始好之爭。連《C專家編程》中都如此調侃:

數組的下標應該是從0還是從1開始?我提議的妥協方案是0.5,可惜他們未予認真考慮便一口回絕。—— Stan Kelly-Bootle

仔細思考一下這個問題很有意思,建議你不妨自己思考一下再繼續往下看。

其實這個問題早在 1982 年就已經由計算機科學領域的大師 Edsger Dijkstra 研究過並得出了一個結論。他手寫了一篇名為《Why numbering should start at zero》的論文,關鍵部分截圖和大體翻譯如下:

表示一個自然數子序列,比如 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) 是我們最喜歡的。

當處理長度為 N 的序列時,我們期望通過下標來區分它的元素。下一個令人煩惱的問題就是,我們該給它的第一個元素賦予什麼樣下標值?堅持 a) 的方式,當下標從1開始時,下標範圍為 1<= i < N+1;當下標從0開始時則是更好看的 0<= i < N。所以,讓我們的序數從0開始:一個元素的序數(下標)等於序列中在它前面的元素個數。這個故事的寓意是我們最好尊重0最為一個最自然的數——過了這麼多個世紀!

———

順便說一句,Python 選擇了 a),所以 range(0,3) 返回的是序列是 0,1,2。

via http://wangcong.org/blog/archives/2230 





[火星人 via ] 為什麼計數應該從零開始?已經有154次圍觀

http://www.coctec.com/docs/program/show-post-71274.html