The correct starting ordinal is 0. A list with a 0th element has cardinality 1. This is a concept that exists in many places in english, where the naturality of starting with the zeroth element trumps inertia but english is wildly inconsistent so it has both.
Constructing the naturals without including 0 and starting with it is incredibly awkward. Addition doesn't even have an identity.
Look at a clock, is 1 at the top, or is it the next one after the top.
Look at a ruler. Does it start at 1?
Do you want to have to shuffle everything around when you go from whole numbers to halves? Do you start at 0.5 or 0? Depends if it is "halves" or the real number 0.5
This is a recipe for pain and off by ones any time you're dealing with time steps (which is why it's so stupid that matlab and fortran are 1 indexed by default, if anything there's a better argument for C to be 1 indexed than scientific languages).
Now index and compose a bunch of ranges. A half open range of two elements is incredibly stupid 1 <= i < 3.
So closed ranges go with 1 indexing. Composing and splitting them is incredibly awkward [a,c] is split into [a,b], [b+1, c] ... that's kind of okay, but not unique as you could use [a,b-1], [b,c]. Now do [d,e], [e,f] compose at a glance?
Half open ranges go with zero indexing and they just work.
Constructing the naturals without including 0 and starting with it is incredibly awkward. Addition doesn't even have an identity.
Look at a clock, is 1 at the top, or is it the next one after the top.
Look at a ruler. Does it start at 1?
Do you want to have to shuffle everything around when you go from whole numbers to halves? Do you start at 0.5 or 0? Depends if it is "halves" or the real number 0.5
This is a recipe for pain and off by ones any time you're dealing with time steps (which is why it's so stupid that matlab and fortran are 1 indexed by default, if anything there's a better argument for C to be 1 indexed than scientific languages).
Now index and compose a bunch of ranges. A half open range of two elements is incredibly stupid 1 <= i < 3.
So closed ranges go with 1 indexing. Composing and splitting them is incredibly awkward [a,c] is split into [a,b], [b+1, c] ... that's kind of okay, but not unique as you could use [a,b-1], [b,c]. Now do [d,e], [e,f] compose at a glance?
Half open ranges go with zero indexing and they just work.