Guest User

Untitled

a guest
Jul 21st, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. ### 为什么编号应该从0开始
  2.  
  3. 当我们想表示自然数的一个子序列2,..., 12但又想去掉那有毒的三个点(省略号)的时候,
  4. 我们通常有以下四种比较公认的选择:
  5.  
  6. a) 2 <= i < 13
  7. b) 1 < i <= 12
  8. c) 2 <= i <= 12
  9. d) 1 < i < 13
  10.  
  11. 那么,在这四种选择中,我们应该有所偏好吗(认为一种比另一种更好吗)?答案是:是的!
  12. 观察一下可以发现,a和b中,右边界减去左边界刚好等于这个子序列的长度;同样的,基于
  13. 之前的观察结果我们可以得出,当存在两个相邻的子序列的时候,a和b两种表示方式,左边
  14. 子序列的右边界就是右边子序列的左边界。以上结论可以让我们排除掉c和d,但是在a和b
  15. 之间,我们还是无法做出选择,所以我们继续观察。
  16.  
  17. 自然数是存在一个最小值的(fyi, 自然数包括0和正整数,左边界为0),如果采用b或者d的
  18. 这种不包含左边界的表示方式的话,当自然数序列里包含0的话,这个表示方式里就必然会
  19. 出现非自然数(e.g. 0, ..., 5, 用b或者d的表示方式的话就必须是-1 < i..blahblah)。这
  20. 种表示方式是很丑陋的,所以相对而言,我们更应该使用a或者c这种包含左边界的表示方式。
  21. 结合之前的推理结果(我们希望右边界减去左边界刚好等于子序列长度),如果一个序列从0
  22. 开始,而我们的表示里又包含了右边界的话,那我们就不得不将左边界定为-1(否则右边界
  23. 减去左边界就不等于序列长度了)。这样的表示方法同样是很丑陋的,所以综上,我们应该
  24. 采用a的这种表示方法。(with all due respect to Prof. Dijkstra,个人感觉最后一步没
  25. 啥推理的必要啊,上面两步已经能说明a方式最好了XD)
  26.  
  27. <u>短评</u> 在Xerox PARC上开发出来的编程语言Mesa,事实上对上面提到的4中表示方式
  28. 都有对应的语法支持。本人通过对于Mesa的丰富的使用经历,发现后三种表示方式通常都是
  29. 粗陋的代码表达和bug的来源。基于之前的经历,我强烈建议Mesa的开发人员使用第一种表达
  30. 方式。我专门提一下这些经历,不管它有没有用,至少如果有人质疑我上面的那些结论没有
  31. 经过实践证实的话,这些通过实践得来证据可以证明。 (短评结束)
  32.  
  33. 当我们希望处理一个长度为N的序列,而且希望通过下标来访问它的元素的时候。下一个让人
  34. 烦恼的问题就会是,它的第一个元素的下标应该是什么。秉承着我们上面推断出的a表达方式,
  35. 如果下标从1开始的话,这个序列的范围可以表示为 1 <= i < N+1; 但是如果下标从0开始的
  36. 话,我们事实上可以得到一个更加优雅的表达方式 0 <= i < N。所以就让我们用0作为第一
  37. 个下标吧:这样任意一个元素的序数(下标)就等于序列里该元素前面的元素个数。这个故事
  38. 的功德在于,经过了这好几百年的争吵,我们终于可以有更好的关注点了。—— 0作为最自然
  39. 的数字来充当序列的开头。
  40.  
  41. <u>短评</u> 许多程序设计语言在设计的时候都没有足够关注这个细节。在FORTRAN语言里,
  42. 下标始终从1开始; 在ALGOL 60和PASCAL语言里,采用的是c表达方式; 更近一些的SASL语言
  43. 又回到了原来FORTRAN的那种表达方式: SASL语言里的一个序列,同时也是正整数的一个函
  44. 数。真是可惜!(正整数的函数意味着下标必定至少从1开始) (短评结束)
  45.  
  46. 上面这些话是因为发生了这件事我才有感而发:我大学里一个数学系的同事——不是计算科学
  47. 家哦,他因为情绪失控,骂一群年轻的计算科学家迂腐,瞎卖弄学问。就因为他们习惯从0开
  48. 始计数。这个同事把有意识的选择最符合逻辑的表达方式当做了一种挑衅。(同样的,他还觉
  49. 得"End of..."这种习惯性表达当做挑衅; 但是这种习惯性表达事实上是很有用的,我听说之
  50. 前有一个学生,就因为觉得卷子上的题目第一页做到底就算做完了(而不是把End of...当做
  51. 题目的结尾),导致一次考试差点挂科了)。我觉得Antony Jay那句话说的很对:"在宗教和其
  52. 他类似事物的认同过程中,一定要铲除异教徒。不见得是觉得他们可能错了,反而是在担心
  53. 他们可能是对的"。
  54.  
  55.  
  56. Plataanstraat 5 11 August 1982
  57. 5671 AL NUENEN prof.dr. Edsger W. Dijkstra
  58. The Netherlands Burroughs Research Fellow
Add Comment
Please, Sign In to add comment