为什么计数要从零开始

网址:http://blog.jobbole.com/95826/

 

为什么应该从 0 开始计数?

要避免使用可恶的省略号来表示自然数子序列 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) 相对来说一种更好的方式。

备注:施乐帕克研究中心(Xerox PARC)开发的语言 Mesa 对上述四种常用的整数表示法都有特殊的标示符。Mesa 上的众多经验表明,其它三种表示法是程序异常之源,所以 Mesa 程序员现在强烈建议不要使用后面三种可用的表达方式。我之所以提到这个经验证据,是因为如果没有实践的证明,会有些人不信服上述的结论。(备注结束)

* *

*

当处理一个长度为 N 的序列,我们希望能用下标来区分每个元素,另外一个难题是起始元素的下标如何赋值。支持方式 a) 的人认为从下标 1 开始,下标的的范围是 1 ≤ i < N+1;但是如果从 0 开始,会有更好的取值范围 0 ≤ i < N。所以我们采用序数 0 作为开始:一个元素的序号(下标)等于序列中位于它前面的元素个数。这个故事的寓意是,经过这几个世纪后,我们最好把 0 当成是一个最自然的数字。

备注:许多程序语言在设计时并没有关注这个细节。如 FORTRAN 的下标是从 1 开始的;ALGOL 60 和 PASCAL 采用的 c) 的形式。最近的 SASL 也遵循 FORTRAN 的惯例:SASL 的一个序列,同时也是一个正整数函数。太遗憾了!(备注结束。)

* *

*

上面的内容是由最近一件事件所引发的,那是一次情感的大爆发,我大学里的一位数学系同事(不是计算机科学家),他指责年轻的计算机科学家“卖弄学问”,因为他们习惯从 0 开始计数。他故意挑选最合理的惯例来挑衅。(以“…结束”的惯例确实很具挑衅性,但这种惯用方式很有用:我知道某一个学生差点没通过考试,就是因为他默认第一页的底部就是问题的结束位置。),我认为 Antony Jay 的声明是对的:“在其它类似的领域中,极端主义者通常会被轰走,这不是因为他可能是错的,而是因为他可能是对的。”

时间: 2024-08-04 10:47:37

为什么计数要从零开始的相关文章

Smart Forms&amp;ScriptFrom

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4292174.html Smart Forms. 1 文本模块... 2 节点元素... 3 Page节点... 3 窗口元素... 4 文本节点... 4 图形节点SE78. 5 模板节点... 6 地址节点... 7 样式... 7 小技

poj 3252 组合数

主要考察组合数知识,初始化的时候参考公式 首先先推个公式,就是长度为len的Round Numbers的个数. 长度为len,第一位肯定是1了. 那么后面剩下 len-1位. 如果len-1是偶数. 那么  C(len-1,(len-1)/2+1)+C(len-1,(len-1)/2+2)+````C(len-1,len-1) =   ( 2^(len-1)-C(len-1,(len-1)/2) )/2; 如果len是奇数 那么就是 (  2^(len-1) )/2 1 #include<cst

从零开始编写自己的C#框架(9)——数据库设计与创建

对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常......当然不同的公司与项目要求不同,初学者要学会适应不同的项目开发要求,使用本框架开发时,必须严格按照本章节的要求来设计数据库,不然可能会产生不可控的异常. 从零开始编写自己的C#框架 数据库设计规范   文件状态: [√] 草稿 [  ] 正式发布 [  ] 正在修改 文件标识: C#框架 当前版本

从零开始学习jQuery (九) jQuery工具函数

原文:从零开始学习jQuery (九) jQuery工具函数 本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery中的Ajax 从零开始学习jQuery (七) jQuery动画-让页面动起来! 从零开始学习jQ

从零开始学习jQuery (二) 万能的选择器

原文:从零开始学习jQuery (二) 万能的选择器 本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery中的Ajax 从零开始学习jQuery (七) jQuery动画-让页面动起来! 从零开始学习jQuery

计数排序与位图排序

计数排序(Counting sort)是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置.计数排序不是比较排序,排序的速度快于任何比较排序算法.由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存.计数排序更适合于小范围集合的排序.比如100万学生参加高考,我们想对这100万学生的数学成绩(

从零开始编写自己的C#框架(25)——网站部署 【转】

服务器安全部署文档 目录1.     前言.. 3 2.     部署环境.. 3 2.1         服务器环境信息.. 3 3.     磁盘阵列配置.. 4 4.     安装操作系统.. 4 5.     安装软件.. 4 5.1         安装磁盘碎片整理程序.. 4 5.2         安装虚拟光盘.. 6 5.3         安装IIS. 6 5.4         安装.NET Framework4. 9 5.5         安装SQL2008. 9 5.6

如何从零开始开发一款嵌入式产品(转)

源:如何从零开始开发一款嵌入式产品 原文地址:[转]如何从零开始开发一款嵌入式产品作者:rainpad (20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结) 首先,如果你有幸看到这篇文章,千万不要试图在2个小时内阅读完,就算你2个小时阅读完,我相信你也不会理解里面讲解的精华之处,我相信,你应该将此文章,慢慢品尝,这绝对是一篇需要品尝2~3天,再结合自己过往的经验,加上自己的思考,我相信会对你不仅仅是技术能力,甚至包括整体的思维方式都会有一个非常大的提高. 结合这篇文章,再结合

从零开始学ios开发(十一):Tab Bars和Pickers

不好意思各位,本人休息了一个礼拜,所以这次的进度延后了,而且这次的学习的内容比较多,时间用的也比较长,文章发布的时间间隔有些长了,望各位谅解,下面继续我们的ios之旅. 这次我们主要学习的内容有2个,一个是Tab Bar,如下图 很熟悉的界面(iphone中的phone),另一个Picker,如下图 在正是开始学习项目之前,先首先简单介绍一下这次的例子的一个结构,当然一个root controller肯定是有的,用来控制其他subController的切换,在root controller中会放