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

2021-06-14 23:03:33 字數 1127 閱讀 7764

眾所周知,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) 那樣。現在,考慮一下從最小的自然數開始的子串行:包含上界就會迫後者不那麼像自然數(譯者注:作者的意思是自然數是乙個有下界沒有上界的集合),當序列縮小成空序列時。這很難看,所以對於上界我們更喜歡

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

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

從零開始學習 slam為什麼選擇slam?

我之前一直從事 影象處理演算法相關工作,因為對於機械人的酷愛,在機械人領域一直很關注,對於目前的工作 貌似對於我的機械人想法 差距比較遠,因此決定開始我的機械人研究之路,我首選的第乙個目標就是拿下slam這個城池,我為何選擇開始我的slam?計算機視覺的研究目前主要分為兩大方向 基於學習的方法和基於...

Django 從零開始

方法1 pip install django 1.6.5 測試是否安裝成功 python import django 1,6,5,final 0 django 使用了 python 標準的 distutils 安裝法,在 linux 平台可能包括如下步驟 tar xzvf django tar.gz...

HTML從零開始

一 標籤 1.使用小寫 2.開始標籤常被稱為開放標籤 opening tag 結束標籤常稱為閉合標籤 closing tag 有效 示例 i reallystrong mean thatem 無效 示例 invalid i reallyem mean thatstrong 二 屬性 1.開始標籤包含...