えらいひとの原本
Why numbering should start at zero
初めに自然数の範囲の表現方法について考えてみよう。2, 3, … 12という範囲を条件式で書こうとすると下記のパターンが考えられる。
a) 2 <= i < 13
b) 1 < i <= 12
c) 2 <= i <= 12
d) 1 < i < 13一見すると c) が「2~12」と表現するように、値の境界が明確で分かりやすいが、右側の数(12)から左側の数(2)を引いて要素の数を求めようとすると 10 となってしまい、1つ足りない状況になってしまう。
そこを回避しようとすると a) と b) が良いことになる。この両者には別のメリットが有り、例えば自然数の範囲のグループを複数用意したい場合、境界が重なり合うことなく表現できる。
a)
2 <= i < 13
13 <= i < 20c) の例で同じことをしようとすると、下記の通り12が両方のグループに入ってしまう。
c)
2 <= i <= 12
12 <= i <= 20かといって、下記のようにすると12と13で数字が異なってしまう。
c)
2 <= i <= 12
13 <= i <= 19上記は数字が異なるだけで、人間が見れば分かりづらい訳では無いが、範囲を指定する数値を変数に置き換えると、c) は分かりづらくなってしまう。
a)
X1<= i < X2
X2 <= i < X3
c)
X1 <= i <= X2
(X2 + 1) <= i <= X3ということで、c) が良さそうだ。
以上を踏まえて、本題の添字を0始まりにするか、1始まりにするかを考えてみる。長さNの配列を考えたとき、
1始まりの場合の添字の範囲
1 <= i < N + 1
0始まりの場合の添字の範囲
0 <= i < N1始まりにしてしまうと終わりをN + 1となるが、0始まりにすると綺麗にNとなる。
ということで、配列の添字は0始まりがベストで、それに合わせて範囲指定も 0 <= i < N がベストということになります。