Off-by-one error para niños
Un error por uno o error por un paso es un tipo de equivocación que ocurre cuando algo se cuenta una vez de más o una vez de menos de lo que debería. Es como si te equivocaras al contar los pasos para llegar a un lugar, dando uno extra o quedándote corto. Este tipo de error es muy común en la programación de computadoras, especialmente cuando se usan "bucles" (instrucciones que se repiten varias veces).
A veces, un programador puede usar una condición como "menor o igual que" cuando en realidad debería ser solo "menor que". O puede olvidar que en muchos lenguajes de programación, las listas o secuencias empiezan a contarse desde el número cero, no desde el uno. Estos pequeños detalles pueden causar que un proceso se repita una vez más o una vez menos de lo necesario.
Contenido
Contando elementos en programación
Cuando trabajamos con listas de información en la computadora, como una lista de nombres o números, a menudo necesitamos procesar una parte de esa lista. Imagina que tienes una lista de elementos y quieres trabajar con los que van desde la posición m hasta la posición n (incluyendo ambos). ¿Cuántos elementos hay en total?
La respuesta que a muchos se les ocurre primero es n menos m. Pero esta respuesta es incorrecta por un elemento. La forma correcta de calcularlo es n menos m más 1. Por ejemplo, si quieres contar los elementos del 3 al 7 (ambos incluidos), la cuenta sería 7 - 3 + 1 = 5 elementos (que son 3, 4, 5, 6, 7).
¿Cómo evitar errores al contar?
Para evitar estos errores, los programadores suelen usar una forma especial de definir los rangos, llamada "intervalos semiabiertos". Esto significa que el rango va desde un número (incluido) hasta otro número (excluido). Por ejemplo, un bucle que se repite cinco veces se puede escribir para que vaya desde 0 (incluido) hasta 5 (excluido).
for (i = 0; i < 5; i++)
{
/* Aquí va lo que el programa hace en cada repetición */
}
En este ejemplo, el código dentro del bucle se ejecuta cuando i es 0, luego cuando es 1, 2, 3 y finalmente 4. Cuando i llega a 5, la condición "i < 5" (i es menor que 5) ya no es verdadera, y el bucle se detiene. Así, el bucle se ejecuta exactamente 5 veces.
Si en lugar de "i < 5" se usara "i <= 5" (i es menor o igual que 5), el bucle se repetiría seis veces, porque también se ejecutaría cuando i fuera 5. De la misma manera, si i empezara en 1 en lugar de 0, el bucle solo se repetiría cuatro veces (para 1, 2, 3 y 4). Ambas situaciones son ejemplos de errores por un paso.
Algunos lenguajes de programación empiezan a contar las posiciones de las listas desde 0, mientras que otros lo hacen desde 1. Es importante saber cómo funciona cada lenguaje para evitar estos errores.
El error de poste
El "error de poste" es un tipo específico de error por un paso que se entiende muy bien con un ejemplo:
Imagina que quieres construir una cerca de 30 metros de largo y vas a colocar un poste cada 3 metros. ¿Cuántos postes necesitas?
La primera respuesta que se nos viene a la mente es 10 (30 metros dividido por 3 metros por poste). Pero esta respuesta es incorrecta. La cerca tendrá 10 secciones de 3 metros, pero necesitarás 11 postes. Piensa en el primer poste al inicio, y luego uno por cada sección.
Este error ocurre porque a veces contamos los elementos (los postes) en lugar de los espacios entre ellos (las secciones), o al revés. También puede pasar si no consideramos si debemos contar el inicio y el final de algo como una sección extra.
Ejemplos del error de poste
Este tipo de error no solo ocurre con postes y cercas. Por ejemplo, la Pirámide del Tiempo, una obra que consiste en 120 bloques colocados cada 10 años, tardará 1190 años en construirse, no 1200. Esto es porque el tiempo se cuenta desde la colocación del primer bloque hasta el último, y hay 119 intervalos de 10 años entre 120 bloques.
Incluso en la historia, ha habido errores de poste. El antiguo calendario juliano, por ejemplo, calculaba los años bisiestos de una manera que resultaba en un año bisiesto cada tres años en lugar de cada cuatro, debido a un error de conteo similar.
Véase también
En inglés: Off-by-one error Facts for Kids