zoukankan      html  css  js  c++  java
  • 为什么有些编程语言的数组要从零开始算

    这个问题,Dijkstra大神在1982年就写过论文了,题为 Why numbering should start at zero

    总共也就3页手写,我就摘重点的大致翻译一下:

    为了表示一个自然数序列2, 3, …, 12,排除掉中间的那三个点(...),总共有四种方式可供我们选择:

    a) 2 <= i < 13

    b) 1 < i <= 12

    c) 2 <= i <= 12

    d) 1 < i < 13

    有没有什么原因使得我们应该选其中的某一种而不是其他的呢?是的,的确有。观察到 a) 和 b) 的优势是不等式的上下界之差恰好是序列的长度。基于此,作为一个中间结论:在 a) 和 b) 两种表达中中,两个序列是邻接的就意味着一个的上界等于另外一个的下界。但这些考量并没有让我们从 a) 和 b) 之中做出选择,所以我们从头开始。

    存在一个最小的自然数。排除掉下界——就像 b) 和 d) 中那样——就会使得一个从最小的自然数开始的序列的下界变成非自然数。这样的表达方式很难看,所以对于下界应该更倾向于<=,就像 a) 和 c) 那样。现在,考虑一下从最小的自然数开始的序列:假如包含上界,当序列缩小成空序列时,就会使得 c) 不那么像自然数集。这样的表达方式也很难看,所以对于上界应该更倾向于<,就像 a) 和 d) 那样。综上所述, 我们应该倾向于使用 a) 的表达方式。

    当处理长度为N的序列时,我们期望通过下标来区分它的元素。下一个恼人的问题就是,我们该给它的第一个元素赋予什么下标值?使用 a) 的表达方式,当下标从1开始时,下标范围为 1 <= i < N+1;当下标从0开始时则是 0 <= i < N,更好看。所以,让我们将序号从0开始:一个元素的序号(下标)等于序列中在它前面的元素个数。这个故事的寓意是我们更应该——过了这么多个世纪!——把0当作一个自然数。

  • 相关阅读:
    Mysql事务的隔离级别,ACID以及三要素的取舍(强一致性弱一致性)、ABA问题
    符合python风格的对象
    python重载运算符之左add右add(radd)
    pycham快捷键
    设置linux时间同步
    描述克隆linux的步骤,以及后续配置
    linux命令
    ransientException: find no Route:SELECT * FROM `ego`.`tb_content_category` LIMIT 0,1000‘
    linux修改vim /etc/profile 配置文件 修改不了
    web.xml
  • 原文地址:https://www.cnblogs.com/wu-chao/p/9159141.html
Copyright © 2011-2022 走看看