思考・考察
The Original Number
tayama
「プログラマと一般人の違いは何?」
こう訊かれたとき、多くのプログラマは “0-origin” を挙げるのではないでしょうか。一般的に、物を数え上げるときは「1番目, 2番目, 3番目…」と数を振ります。一方プログラマは、「0番目, 1番目, 2番目…」というように、物を0から数えるのです。
プログラミングを勉強したことの無い人にとっては、プログラマのこのような習慣は奇妙に見えるかもしれません。しかしながら、この背景にはプログラマなりの合理性があるのです。
たとえば、いくつかの駅からなる電車の路線を想像してください。これらの駅に対して、片方の終点から順に、1, 2, 3, … と番号を振ることを考えます。このナンバリングの規則を、簡潔に、正確に、かつ一般的に (= 4番目以降の駅についても読者の推測に任せることなく) 言おうとするとどうなるでしょうか?
「終点の駅から i 駅離れた駅の番号が i+1 である (i>=0)」と言えば、これらすべての条件を満たすことになります。簡潔で間違いが無く、しかもどんなに遠くの駅についてもはっきりと駅の番号を述べています。
しかし、”+1″ が邪魔だとは思わないでしょうか?そもそも、もし 0, 1, 2, … と番号を振っていれば、「終点の駅から i 駅離れた駅の番号が i である」と言うことができ、表現がより簡潔になるのです。
この簡潔さはコンピュータの設計と密接に関わっており、そのためにプログラマは0から物を数えることを好むのです。
それでも、「1を足し引きすれば辻褄を合わせられるのだから、そんなことはたいした問題ではない。日常生活においては、やっぱり1から数えたほうが直感的だ!」と言う人もいるかもしれません。
0から数えないと本当に面倒なことになるのは、負の数を導入しようとしたときです。
ところで、今年の100年前は西暦何年でしょうか?今は西暦2010年なので、2010 – 100 で西暦1910年と簡単に答えられます。それでは、西暦50年の100年前は何年でしょうか?
50 – 100 = -50 なので、紀元前50年?いいえ違います。実は、西暦も紀元前も1年から数え始めます。つまり、西暦1年の1年前は紀元前1年であり、西暦50年の100年前は紀元前51年になるのです。
もし西暦が「イエス・キリストが生まれた年の n 年後を西暦 n 年とする」と定義されていたならば、こんなややこしい問題は起こらなかったのです。
とはいえ、西暦を定義した人を責めるのは酷というものでしょう。なにしろ人類が 0 という概念を確立したのはキリストよりもずっと後のことなのですから。
しかし、その後の社会においても、西暦と同じ轍を踏んでしまった例が見受けられます。その一つが、建物の階数です。0階というものはどんな建物にも存在せず、地上1階の1つ下が地下1階という奇妙なことになっています。
直感的に考えて直感的に感じるものが実は直感的ではなかったり、きわめて直感的なものに直感が直感的でないと囁き掛けたりするということは、まったくもって直感的に明らかではありません。
私が思うに、簡潔さと厳密さの中にこそ本当の分かりやすさがあるのでしょう。