Por qué deberíamos contar desde cero

Este es un breve documento de Edsger Dijkstra que traduje hace un tiempo y tenía cubierto de polvo en algún directorio de mi disco duro.

A simple vista parece una trivialidad: ¿Qué más da si comenzamos a contar desde 0, desde 1 o desde cualquier número natural? Pero luego, cualquier persona que haya programado sin tener en cuenta estas cuestiones y que haya renegado depurando sus programas teniendo que sumar o restar 1 por aquí y por allá para considerar «casos especiales» en el tratamiento de secuencias o arreglos, sabrá valorar este pequeño artículo.

Por qué la numeración debería empezar desde cero

Para denotar la subsecuencia de números naturales 2,3,…,12 sin los perniciosos tres puntos, se nos ofrecen cuatro conveciones

a)   2 ≤ i < 13
b)   1 < i ≤ 12
c)   2 ≤ i ≤ 12
d)   1 < i < 13

¿Existen motivos para preferir una convención sobre las otras? Si, existen. La observación que las convenciones a) y b) tienen la ventaja que la diferencia entre las cotas es igual a la longitud de la subsecuencia es válida. También lo es la observación que como consecuencia, en cualquiera de las dos convenciones, el hecho que dos subsecuencias sean adyacentes significa que la cota superior de una es la cota inferior de la otra. Aunque esas observaciones son válidas, no nos habilitan a elegir entre a) y b), por lo tanto comencemos nuevamente.

  • Existe el mínimo número natural. La exclusión de la cota inferior —como en b) y en d)— obligan para una subsecuencia que comience en el menor número natural a que la cota inferior pertenezca al reino de los números no naturales. Eso es feo, por lo tanto preferimos para la cota inferior el ≤, como an a) y en c).
  • Consideremos ahora las subsecuencias que comienzan en el mínimo número natural: la inclusión de la cota superior obligaría a esta última a ser un número no natural, en el caso que la secuencia sea contraída a la vacía. Eso es feo, por lo tanto para la cota superior preferimos el <, como en a) y en d).

Concluimos que debe preferirse la convención a).

Comentario: El lenguaje de programación Mesa, desarrollado en Xerox PARC, tiene notaciones especiales para intervalos de enteros en las cuatro convenciones. La experiencia extensa con Mesa ha mostrado que el uso de las otras tres convenciones ha significado una constante fuente de torpeza y errores, y a causa de esa experiencia, a los programadores Mesa se les aconseja fuertemente no usar las últimas tres características disponibles. Menciono esta evidencia experimental —para lo que vale— porque algunas personas se sienten incómodas con las conclusiones que no han sido confirmadas en la práctica. (Fin del comentario.)

Cuando manipulamos una secuencia de longitud N, cuyos elementos queremos distinguir con un subíndice, la pregunta controversial es qué valor asignar a su elemento inicial. Siguiendo la convención a) resulta, cuando comenzamos con el subíndice 1, el rango 1 ≤ i < N+1; comenzando con 0, sin embargo, obtenemos el rango 0 ≤ i < N, mucho más agradable. Por lo tanto dejemos que nuestros ordinales comiencen en cero: un elemento ordinal (subíndice) es igual a la cantidad de elementos que lo preceden en la secuencia. Y la moraleja de la historia es que deberíamos ver —¡después de todos estos siglos!— al cero como un número natural más.

Comentario: Varios lenguajes de programación han sido diseñados sin prestar atención a este detalle. En FORTRAN los subíndices siempre comienzan desde 1; en ALGOL 60 y en PASCAL, se ha adoptado la convención c); el más reciente SASL ha caído en la misma convención que FORTRAN: una secuencia en SASL es, al mismo tiempo, una función sobre los enteros positivos. ¡Lástima! (Fin del comentario.)

Lo anterior ha sido desencadenado por un reciente incidente, 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 —tal como lo hacen habitualmente— comenzaron a enumerar desde cero. Concientemente tomó la más sensible convención como una provocación. (También la convención «Fin del…» es vista como provocativa; pero es una convención útil: Conozco un estudiante que casi reprobó un examen por suposición tácita de que las preguntas terminaban al pié de la primera página). Creo que Antony Jay tiene razón cuando afirma que: «En las religiones corporativas como en otros ámbitos, el hereje debe ser expulsado no por la probabilidad de que esté equivocado, sino por la posibilidad de que esté en lo cierto.»

Países Bajos, 11 de agosto de 1982

(También puede consultar el manuscrito original de este artículo y su transcripción, ambos en inglés.)

12 comentarios sobre “Por qué deberíamos contar desde cero

  1. Pingback: meneame.net
  2. Te has dejado un buen trozo por traducir y ni siquiera avisas!

    Dijkstra era un cachondo mental además de un genio. En la parte que falta se burla de su colega matemático por quejarse del 0 y compadece a sus estúpidos alumnos por no ser tan metodicos como los lenguajes de programacion decentes en la redaccion de examenes.

    No aporta nada a la ciencia, pero sigue siendo divertido ;-)

  3. I just like the valuable info you provide for your articles.
    I’ll bookmark your weblog and check once more here regularly. I am somewhat certain I’ll be told many new stuff right right here! Best of luck for the following!

  4. Empezando desde 1, la posición del elemento n coincidirá con el número de elementos desde el primero hasta el elemento n. Dicho de otro modo, usaremos los mismos números para enumerar que para contar.

    Sin embargo, comenzando desde 0 esa propiedad se pierde.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *