漫話:為什么程序員喜歡使用0 ≤ i < 10這種左閉右開的形式寫for循環(huán)?
當(dāng)我們想要寫一個循環(huán)體,期望執(zhí)行10次的時候,我們會使用以下方式:
- for (int i=0; i<10; i++){
- }
可以看到,為了保證循環(huán)10次,我們定義了一個整數(shù)變量從0開始,然后循環(huán)10次,結(jié)束條件是i < 10。
其實這個本質(zhì)就是使用了0 ≤ i < 10這種表達形式。
之所以很多人都這么寫,有一個最主要的原因就是剛開始學(xué)編程的時候,老師都是這么教的…
關(guān)于這個問題,其實還有一位偉大的數(shù)學(xué)家曾經(jīng)討論過他的合理性。
這個人就是Dijkstra,他也是離散數(shù)學(xué)中應(yīng)用廣泛的最短路徑算法的提出者,并且還提出了銀行家算法。
他在1982年發(fā)表了一篇說明《Why numbering should start at zero》,這里面有部分內(nèi)容闡述了這個觀點。
他首先提出一個問題,讓我們通過一個條件表達式表示 2,3,4,5,6,7,8,9,10,11,12 這11個數(shù)字,其實一般有以下四種寫法:
- a) 2 ≤ i < 13
- b) 1 < i ≤ 12
- c) 2 ≤ i ≤ 12
- d) 1 < i < 13
這幾種也是我們在寫for循環(huán)的時候可能會用到的一些表示式,那著四種寫法有沒有好壞之分呢?
答案是有的。
我們其實可以觀察到,a) 和 b)有個優(yōu)點,上下邊界的相減得到的差,正好等于子序列的長度,即13-2 = 12-1 = 11; 這樣的寫法可以讓我們快速知道這個表示表達式中一共包含多少個自然數(shù)。
當(dāng)然,這并不是正菜,只是開胃而已…
接下來,Dijkstra分別從表達式的上下界討論了到底使用≤還是<更合理。
首先,他論證了一下表達式的下界使用哪種形式合理。
他認為,當(dāng)我們想要表達自然數(shù)2-12的時候,如果使用1 < i作為這個序列的下界的話,這個下界的起始值進入了非自然數(shù)的區(qū)域。而使用2 ≤ i,那么就可以嚴格的保證這個下界就是一個自然數(shù)2 。所以,他認為下界使用≤更加合理。
符合這種形式的就是a) 和 c)兩種。
那么a) 和 c)還有一個區(qū)別,就是上界一個用了≤一個用了<,那該使用哪種方式更加合適呢?
Dijkstra提出,如果想要表達一個空序列,使用a) 形式可以很容易的表達,如 0<= i <0就可以表示一個空序列。
但是如果上界和下界都用<= 就無法表示了,除非用1 <= i <= 0,但是這種形式就很不合邏輯。
所以,綜上,他認為a) 2 ≤ i < 13 這種表達方式更加合理一些。
也就是說,使用左閉右開的形式定義表達式合理也更加優(yōu)雅!
參考資料:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
本文轉(zhuǎn)載自微信公眾號「漫話編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系漫話編程公眾號。