漫话:为什么程序员喜欢使用0 ≤ i < 10这种左闭右开的形式写for循环?

2020-06-29 23:45

a97d5b6cedebc9135eedb9c05780cccf.webp

46c47436e6bf351dee0d2d1ceabf8eba.webp

a785b74bf63b2c62115f33287aaee969.webp

4f5cbdca0a91a2eeb5f99ed640d168d1.webp

0f92e08c21002810207d16093ac901e4.webp

3c5d129b7ea35da2063bb363b7d67dbb.webp

f418c2876d2d34ab6e32caf5128586b9.webp

4a3d9b8eb98a683915e10c78021a9de2.webp

当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式:

for (int i=0; i<10; i++){

}

可以看到,为了保证循环10次,我们定义了一个整数变量从0开始,然后循环10次,结束条件是i < 10。

其实这个本质就是使用了0 ≤ i < 10这种表达形式。

之所以很多人都这么写,有一个最主要的原因就是刚开始学编程的时候,老师都是这么教的…

41f8d8bb2e437604debc71f494578183.webp

6870c6a74301432952befdd05e4da4ba.webp

a7049a6a58cd0663f7bf1c5d00541d5f.webp

dbabe8faacab6db7f2e6e0d3d2abbaaf.webp

关于这个问题,其实还有一位伟大的数学家曾经讨论过他的合理性。

这个人就是Dijkstra,他也是离散数学中应用广泛的最短路径算法的提出者,并且还提出了银行家算法。

他在1982年发表了一篇说明《Why numbering should start at zero》,这里面有部分内容阐述了这个观点。

他首先提出一个问题,让我们通过一个条件表达式表示 2,3,4,5,6,7,8,9,10,11,12 这11个数字,其实一般有以下四种写法:

  • a) 2 ≤ i < 13

  • b) 1 < i ≤ 12

  • c) 2 ≤ i ≤ 12

  • d) 1 < i < 13

这几种也是我们在写for循环的时候可能会用到的一些表示式,那着四种写法有没有好坏之分呢?

答案是有的。

8934e2785a3fac46524e2eed05f67e9d.webp

77525609683595b26377363ace27b818.webp

07023baa830fca323b218adba4750830.webp

我们其实可以观察到,a) 和 b)有个优点,上下边界的相减得到的差,正好等于子序列的长度,即13-2 = 12-1 = 11; 这样的写法可以让我们快速知道这个表示表达式中一共包含多少个自然数。

当然,这并不是正菜,只是开胃而已…

接下来,Dijkstra分别从表达式的上下界讨论了到底使用还是<更合理。

首先,他论证了一下表达式的下界使用哪种形式合理。

他认为,当我们想要表达自然数2-12的时候,如果使用1 < i作为这个序列的下界的话,这个下界的起始值进入了非自然数的区域。而使用2 ≤ i,那么就可以严格的保证这个下界就是一个自然数2 。所以,他认为下界使用更加合理。

符合这种形式的就是a) 和 c)两种。

那么a) 和 c)还有一个区别,就是上界一个用了一个用了<,那该使用哪种方式更加合适呢?

Dijkstra提出,如果想要表达一个空序列,使用a) 形式可以很容易的表达,如 0<= i <0就可以表示一个空序列。

但是如果上界和下界都用<= 就无法表示了,除非用1 <= i <= 0,但是这种形式就很不合逻辑。

所以,综上,他认为a) 2 ≤ i < 13 这种表达方式更加合理一些。

也就是说,使用左闭右开的形式定义表达式合理也更加优雅!

5ddf78586a1ef987b9e8e8b635d7dfae.webp

c0d9ab22ff492ed9d26c4409529752bc.webp

09ddc5dbacec1e2d1099501fbf46471d.webp


参考资料:

http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html


关于作者漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。


推荐阅读:


6e0acecf2154790b2136bbd77588992d.webp喜欢我可以给我设为星标哦6e0acecf2154790b2136bbd77588992d.webp

6f95081b0f816130f88ec1e5c7dac76e.webp好文章,我“在看”fb978080df6a87c7ca04ae8e77fd81a3.webp
浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报