El acumulador,¿qué es y cómo se usa?
Saludos a tod@s! En esta ocasión hablaré un poco el acumulador, que es un tipo de variable especial muy utilizada en programación.
¿Qué es?
Un acumulador es una variable, no necesariamente entera, pero sí numérica, y cuyo valor se incrementará dependiendo del problema. Su objetivo es “acumular”, es decir: acopiar, almacenar, añadir un cierto valor. La diferencia con una variable cualquiera es que el acumulador agrega un nuevo valor al que ya tiene. (Por lo general, una operación de asignación “encima” el valor nuevo borrando el valor viejo de una variable)
El acumulador debe ser inicializado antes de ser utilizado. Pero el valor de inicialización dependerá del tipo de operación que nos ayudará a acumular valores: puede ser el resultado de sumas sucesivas (que es lo más común), pero también de multiplicaciones, o incluso de restas o divisiones.
Cómo usar un acumulador
La expresión de acumulación.
Éste término me lo he sacado de la manga (o sea que me lo he inventado), para definir la instrucción en donde se expresa una acumulación. En la figura 1 te muestro la estructura general de una expresión de acumulación típica.

Figura 1. La expresión de acumulación
Como puedes observar, las siguientes son características de una expresión de acumulación:
- La variable acumuladora debe aparecer a la derecha y a la izquierda del operador de asignación
- La acumulación se realiza con los operadores aritméticos: +, -, *, /.
- Los operadores booleanos y relacionales no pueden ser parte de una expresión de acumulación, puesto que estos valores no pueden sumarse o multiplicarse.
- Se pueden escribir expresiones de acumulación de una forma elegante y corta utilizando los operadores +=, -=, *= y /=. (Aquí puedes leer un poco más sobre el tema)
- En las operaciones de suma y multiplicación no importa si el acumulador no está exactamente antes y después del operador =, puesto que estas operaciones son conmutativas. Sin embargo, debes tener mucho cuidado con la resta y la división, pues no es lo mismo:
10-3 que 3-10
- Aunque se puede utilizar, es muy raro acumular residuos de divisiones. Claro que, si el problema lo exige, sabes que deberás usar el operador %. Sólo recuerda que el acumulador debe ser una variable entera, ya que el operador % sólo funciona sobre valores enteros.
Inicialización de la variable acumuladora.
Antes de utilizar una expresión de acumulación, es necesario inicializar la variable.
Recuerda que la inicialización de una variable no es más que asignarle un valor de inicio a la variable. La variable debe tener un valor almacenado antes de poder ser utilizada.
¿Qué pasa si no se inicializa un acumulador?
En el lenguaje Java, no puedes usar una variable sin haberla inicializado, pues será marcado como error de sintáxis. Puedes ver un ejemplo de esto en la figura 2. El error detectado es “variable x might not have been initialized“, indicando precisamente que la variable x no ha sido inicializada. Esto te impedirá correr el programa.

Figura 2. Uso de un acumulador sin inicialización
En el lenguaje C, si una variable no ha sido inicializada, entonces tiene un valor de “basura” o “sucio”. Simplemente es el valor de la localidad de memoria que se le asignó a esta variable. Es casi como si alguien se mudara a un departamento, y encontrara basura que el ocupante anterior dejó. Así también sucede con los programas, pues al terminar de ejecutarse, muy pocos hacen una “limpieza” de las áreas de memoria que utilizaron.
Que una variable acumuladora tenga un valor de basura tampoco es bueno. Considera el programa de la figura 2, el cual debe sumar los números del 1 al 5, y ahora observa la prueba de escritorio, la cual se muestra en el figura 3.

Figura 3. Prueba de escritorio
Explicaré un poco la tabla: supongamos que x tiene un valor sucio inicial de -3456:
- Cuando i = 1, la condición de fin se evalúa como verdadera, por lo que tenemos permiso de entrar al ciclo.
- En la primera iteración del ciclo (i=1), la expresión de acumulación:
x = x + i
Se traduce como:
x = -3456 + 1
- Observa que, desde el primer uso de la expresión de acumulación, se emplea el valor sucio de x, y éste simplemente se incrementa, generando un resultado de -3451, y no 15, que es el valor esperado de la suma de 1 + 2 + 3 + 4 + 5.
Por lo tanto, siempre es necesario inicializar la variable: si usas Java, el no hacerlo te generará un error de compilación, y si usas C, el no hacerlo te generará un error de lógica.
Inicialización del acumulador que suma.
Cuando la operación de acumulación sea una suma, el valor de inicialización del acumulador será 0. Esto es debido a la propiedad de identidad de la suma, la cual dice que:
Al número cero se le llama identidad aditiva porque la suma o adición de cero no cambia el valor de ningún número [MathematicsDitionary]
Esto hace que x +0 = 0 + x = x, lo cual es ideal para iniciar a acumular un valor dentro de un ciclo.
Inicialización del acumulador que multiplica.
Cuando la operación de acumulación sea una multiplicación, el valor de inicialización del acumulador será 1. También, así como con la suma, se usa este número debido a que es la identidad de la multiplicación, ya que la multiplicación por 1 no cambia el valor de ningún número, en tanto que la multiplicación por cero elimina cualquier valor guardado en la variable.
Ejemplos
Ejemplo # 1: Acumulando sumas.
En matemáticas existe el operador sumatoria (Σ), que utilizamos para denotar que se realizarán sumas a partir de una valor dado hasta un límite. Para dar un ejemplo sobre el uso de un acumulador, utilizaré la siguiente ecuación matemática:
Esta ecuación expresa que en y se acumulará la suma de los cuadrados de los n primeros números naturales. Supongamos que n = 5, esto implicaría:
Uno de los errores más comunes de los programadores novicios al resolver este tipo de problemas, es pensar que la operación debe realizarse toda completa al mismo tiempo. Así nunca llegarás a la solución. Una mejor forma de resolver el problema es pensar que el valor de y se obtendrá en pasos, de la siguiente forma:

Figura 3. Acumulador para el problema de la sumatoria
Como puedes observar, en la primera instrucción, se suma 0 con 1 al cuadrado y ese valor se almacena en y, el cual funciona como el acumulador. En el segundo paso, al valor actual de y, 1( que es el resultado de la suma 0 + 1), se le suma 2 al cuadrado. Y así sucesivamente, de forma que el algoritmo que resuelve este problema es el siguiente:
INICIO y = 0 n = 5 para (k=1; k<=n; k++) y = y + k * k Imprimir(y) FIN
Observa como se ha expresado la operación de acumulación:
y = y + k * k
Usando y como variable que acumulará la suma de k al cuadrado, expresada como k*k.
Ejemplo # 2: Acumulando productos.
Un problema muy común en programación es el cálculo del factorial de un número. El problema dice lo siguiente:
“El factorial de un número es igual al producto de sí mismo menos uno de forma sucesiva hasta llegar a 1”
El símbolo matemático es ! (no confundir con el operador ! que significa not en Java). Por ejemplo:
5! se lee “factorial de 5” y es igual a:
5! = 5 x 4 x 3 x 2 x 1 = 120
Una vez más para calcular el factorial de un número cualquiera, no consideres el cálculo como una operación que debe realizarse toda en el mismo tiempo, sino por partes, como lo puedes ver en la figura 4.

Figura 4. Acumulador de productos
A continuación, se muestra el algoritmo que resuelve este problema, calculando el factorial de un número proporcionado por el usuario.
INICIO factorial = 1 Leer(num) para (i=num; i>=1; i--) factorial = factorial * i Imprimir(factorial) FIN
Como puedes apreciar, inicializo factorial a 1, el valor identidad de la multiplicación. Dentro del ciclo for, utilizo la expresión de acumulación:
factorial = factorial * i
La cual también puede expresarse de la siguiente forma:
factorial *= i
Y en la figura puedes ver una explicación gráfica de las primeras dos iteraciones del ciclo for de este algoritmo.

Figura 5. Las primeras dos iteraciones del algoritmo que obtiene el factorial de un número
Lo que no debes hacer
Para terminar esta entrada, un consejo sobre lo que no debes hacer con un acumulador. Ya hablamos de lo fundamental que es la inicialización del acumulador, pero faltó aclarar en qué momento se debe inicializar. La respuesta es muy simple: antes de entrar al ciclo.
Si cometes el error de inicializar la variable dentro del ciclo, estarás perdiendo el valor acumulado. Vamos a suponer que el algoritmo del problema del factorial se hubiera escrito de esta forma:
INICIO Leer(num) para (i=num; i>=1; i--) inicio factorial = 1 factorial = factorial * i Imprimir(factorial) fin FIN
Como puedes observar, ahora el ciclo for repite dos líneas de código: le asigna 1 a la variable factorial, y después acumula la multiplicación. Pero el hecho de estar repitiendo la inicialización hará que factorial pierda los productos acumulados, y no se obendrá el valor esperado. Observa la prueba de escritorio de esta versión:

Figura 6. Prueba de escritorio cuando el acumulador se inicializa dentro del ciclo
¿Alcanzas a apreciar el error? Cada vez que se ejecuta la inicialización, factorial se pone a 1, perdiendo el valor que iba a acumular. Esta acción la he resaltada en la tabla. El resultado de ejecutar este algoritmo cuando num=5, es que su factorial es 1, lo cual sabemos que no es la respuesta correcta. Así que ten mucho cuidado en donde inicialices el acumulador.
Con esto termino este largo post sobre el uso de los acumuladores. Es un tipo de variable muy importante, porque es muy utilizada en el cálculo de series matemáticas, entre otros tipos de problemas.
Me despido de ustedes, y ya saben, si les ha parecido útil este artículo, compártanlo con quien lo necesite o escríbeme un comentario. ¡Hasta la próxima!