La recursividad es un concepto que podríamos clasificar como avanzado dentro de la serie de habilidades que debes desarrollar como programador/a. Sin embargo, es probable a que hayas estado expuesto/a al mismo y lo hayas escuchado en distintos contextos, por lo que la intención de este artículo es poder introducirte a este concepto tal que su sola mención no despierte temor, y puedas familiarizarte con el tipo de problemas donde esta técnica puede resultar útil.
Iniciemos con el concepto más directo y claro: una función recursiva es una función que se llama a sí misma dentro de su propia ejecución. Sin embargo, aunque esta primera idea pueda parecer sencilla a priori, lo cierto es que no estamos acostumbrados a pensar de manera recursiva, lo que puede complicar su implementación cuando intentamos abordar un programa desde esta propuesta. Nuestra manera de pensar, por lo general, nos lleva a una secuencia de pasos o, si debemos realizar la misma tarea muchas veces, en iteraciones (repeticiones).
Lo que debemos aclarar también es que una función recursiva tienen su propio ámbito de aplicación, y puede ser considerada una buena manera de resolver un problema en ciertas situaciones que involucran algún tipo de iteración. En particular, cuando podemos expresar dicha iteración como la ejecución de los mismos pasos que se habían llevado a cabo hasta el momento. Dicho de otra manera, es el caso en el que el problema a resolver puede dividirse en una serie de pasos que tienen la misma finalidad que el problema en general, y por lo tanto podrían resolverse con esta misma función.
Pensemos por ejemplo en el caso en que deseemos conocer la cantidad de alumnos que forman parte de una universidad, y que la única forma de lograrlo sea a través de contar la cantidad de alumnos que estudian cada una de las carreras:
- Un enfoque iterativo, sería ir recorriendo cada una de las carreras, contar cuántos alumnos tiene la misma, y en función de este resultado, actualizar una variable que lleve la cuenta total, tal que el nuevo total sea el total anterior + la cantidad de estudiantes de una nueva carrera.
- Una estrategia recursiva, implicaría definir una función que calcule el total de alumnos de una carrera, más el total de alumnos de las demás carreras. El total de alumnos de las demás carreras, entonces, se calcularía siguiendo el mismo procedimiento anterior.
Planteada correctamente, una función recursiva puede generar un código elegante y más breve que el de una clásica iteración. Además, ciertos problemas matemáticos y de optimización, son de naturaleza recursiva, con lo cual este enfoque implementa los conceptos involucrados a través de su definición hasta llegar al resultado (estos son, por ejemplo, los casos de la serie de Fibonacci y los factoriales, que veremos implementados en Python en un siguiente artículo).
Sin embargo, toda función recursiva requiere tomar una precaución fundamental: definir el caso base, aquel que de alcanzado, no permita continuar ejecutando la función pues de lo contrario se llegaría a una recursividad infinita que agotaría los recursos del ordenador antes de lo que tardarías en pronunciar "recursivo". Sin ser lo mismo, consiste en tomar los mismos recaudos que consideramos al plantear la condición de salida en un loop while.
Si ya te vas sintiendo cómodo/a con lo que hemos visto hoy, te veré en el siguiente artículo, donde hablaremos de la recursividad en Python y cómo se gestiona la memoria en estos casos.