¿Por qué la numeración debería comenzar en cero?
Para denotar la secuencia de números naturales 2, 3, ..., 12, sin los malvados tres puntos, tenemos cuatro convenciones disponibles:
a) 2 ≤ i < 13
b) 1 < i ≤ 12
c) 2 ≤ i ≤ 12
d) 1 < i < 13
¿Hay razones para preferir una convención sobre otra?
Sí, las hay.
Las convenciones a) y b) tienen la ventaja de que la diferencia entre sus extremos es igual a la longitud de la secuencia. También es válido que, como consecuencia, en ambas convenciones, dos secuencias son adyacentes si el extremo superior de una es igual al extremo inferior de la otra.
Aunque estas observaciones son válidas, no nos permiten elegir entre a) y b); así que comencemos de nuevo.
Existe un número natural más pequeño. Dejar fuera al extremo inferior -como en b) y d)- fuerza, para una secuencia que comienza en el número natural más pequeño, al extremo inferior mencionado, a entrar en el mundo de los números no naturales. Eso es feo, por lo que para el extremo inferior preferimos ≤ como en a) y c).
Consideremos ahora las secuencias que comienzan en el número natural más pequeño: la inclusión del extremo superior forzaría entonces al último a ser no natural cuando la secuencia se haya reducido a la vacía. Eso es feo, por lo que para el extremo superior preferimos < como en a) y en b). Concluimos que la convención a) debe ser la preferida.
Observación: El lenguaje de programación Mesa, desarrollado en Xerox PARC, tiene notaciones especiales para intervalos de enteros en las cuatro convenciones. Una amplia experiencia con Mesa ha mostrado que el uso de las otras tres convenciones ha sido una fuente constante de torpezas y errores, y debido a esa experiencia, se aconseja encarecidamente a los programadores de Mesa que no utilicen las últimas tres características disponibles. Menciono esta evidencia experimental, por si sirve de algo, a pesar de que algunas personas puedan sentirse incómodas con conclusiones que no han sido confirmadas en la práctica. (Fin de la Observación).
Cuando tratamos con una secuencia de longitud N, cuyos elementos queremos distinguir mediante subíndices, la siguiente pregunta es qué valor de subíndice asignar a su primer elemento. Adhiriéndonos a la convención a), cuando comenzamos con el subíndice 1, el rango de subíndices es 1 ≤ i ≤ N+1; comenzando con 0, sin embargo, nos da el rango más agradable 0 ≤ i < N. Así que permitamos que nuestros ordinales comiencen en cero: el ordinal (subíndice) de un elemento es igual al número de elementos que lo preceden en la secuencia. Y la moraleja de la historia es que, después de todos estos siglos, deberíamos considerar al cero como un número muy natural.
Observación: Muchos lenguajes de programación han sido diseñados sin prestar mucha atención a este detalle. En FORTRAN, los subíndices siempre comienzan en 1; en ALGOL 60 y en PASCAL se adoptó la convención c); el más reciente SASL ha vuelto a la convención de FORTRAN: una secuencia en SASL es al mismo tiempo una función sobre los enteros positivos. ¡Lástima! (Fin de la Observación)
Lo anterior ha sido provocado por un incidente reciente, cuando en un arrebato emocional, uno de mis colegas matemáticos en la universidad -no un científico de la computación- acusó a un grupo de jóvenes científicos de la computación de "pedantería" porque, como hacen por convención, ellos empezaron a enumerar desde cero. Él consideró concientemente que la adopción de esta convención era una provocación. (También, la última convención es vista como provocativa; pero la convención es útil: conozco a un estudiante que casi suspendió un examen por la suposición tácita de que las preguntas terminaban al final de la primera página.) Creo que Antony Jay tiene razón cuando afirma: "En las religiones corporativas como en otras, el hereje debe ser expulsado no porque sea probable que esté equivocado, sino por la posibilidad de que tenga razón".
Prof. Edsger W. Dyskstra
11 de agosto de 1982
Traducido desde:
https://www.cs.utexas.edu/~EWD/ewd08xx/EWD831.PDF
(por si el link falla, subo el pdf).
No hay comentarios:
Publicar un comentario