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

2020 年 6 月 29 日 CSDN
作者 | 漫话编程
来源 | 漫话编程(ID:mhcoding)
当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式:
   
   
     
     
     
       
for ( int i= 0; i< 10; i++){

}
可以看到,为了保证循环10次,我们定义了一个整数变量从0开始,然后循环10次,结束条件是i < 10。
其实这个本质就是使用了0 ≤ i < 10这种表达形式。
之所以很多人都这么写,有一个最主要的原因就是刚开始学编程的时候,老师都是这么教的…
关于这个问题,其实还有一位伟大的数学家曾经讨论过他的合理性。
这个人就是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循环的时候可能会用到的一些表示式,那着四种写法有没有好坏之分呢?
答案是有的。
我们其实可以观察到,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 这种表达方式更加合理一些。
也就是说,使用左闭右开的形式定义表达式合理也更加优雅!
参考资料:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。

更多精彩推荐

密码界“女杀手”,破译世上最安全密码系统,获 771 万奖金!

字节跳动 8 年,抖音、头条的技术能力开发者都可以用起来了!

他被称为"中国第一程序员",一人之力单挑微软,如今拜入武当修道

高文、张钹、杨强隔空论道:AI精度与隐私的博弈

带你从零入门 Serverless | 一文详解 Serverless 架构模式

中央银行数字货币的总体框架

你点的每个“在看”,我都认真当成了喜欢
登录查看更多
0

相关内容

人们为了让计算机解决各种棘手的问题,使用编程语言 编写程序代码并通过计算机运算得到最终结果的过程。
【2020新书】现代C++初学者指南,301页pdf
专知会员服务
156+阅读 · 2020年7月24日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
Python导论,476页pdf,现代Python计算
专知会员服务
253+阅读 · 2020年5月17日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
MIT新书《强化学习与最优控制》
专知会员服务
270+阅读 · 2019年10月9日
面试题:Word2Vec中为什么使用负采样?
七月在线实验室
46+阅读 · 2019年5月16日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
博客 | MIT—线性代数(上)
AI研习社
8+阅读 · 2018年12月18日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
利用 TensorFlow 实现排序和搜索算法
机器学习研究会
5+阅读 · 2017年11月23日
机器学习实践指南
Linux中国
8+阅读 · 2017年9月28日
想让机器人替你聊天?1小时手把手训练一个克隆版的你
Neural Response Generation with Meta-Words
Arxiv
6+阅读 · 2019年6月14日
Stock Chart Pattern recognition with Deep Learning
Arxiv
6+阅读 · 2018年8月1日
Arxiv
6+阅读 · 2018年2月24日
Arxiv
5+阅读 · 2018年1月23日
Arxiv
5+阅读 · 2017年11月30日
VIP会员
相关VIP内容
【2020新书】现代C++初学者指南,301页pdf
专知会员服务
156+阅读 · 2020年7月24日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
Python导论,476页pdf,现代Python计算
专知会员服务
253+阅读 · 2020年5月17日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
336+阅读 · 2020年3月15日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
MIT新书《强化学习与最优控制》
专知会员服务
270+阅读 · 2019年10月9日
相关资讯
面试题:Word2Vec中为什么使用负采样?
七月在线实验室
46+阅读 · 2019年5月16日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
博客 | MIT—线性代数(上)
AI研习社
8+阅读 · 2018年12月18日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
利用 TensorFlow 实现排序和搜索算法
机器学习研究会
5+阅读 · 2017年11月23日
机器学习实践指南
Linux中国
8+阅读 · 2017年9月28日
想让机器人替你聊天?1小时手把手训练一个克隆版的你
相关论文
Top
微信扫码咨询专知VIP会员