Sie sind auf Seite 1von 13

Recursividad y sus

aplicaciones
ASPIRANTE: EDGAR RODRIGO LOPEZ SILVA
Definición
La recursión (recursividad) representa una poderosa técnica de programación en la que un
método se llama a sí mismo, es decir, desde la definición de dicho método.
Una excelente analogía a la recursión son el conjunto de muñecas rusas (matrioshka): Una
muñeca rusa tienen una muñeca rusa más pequeña dentro de ella, que tiene una muñeca rusa
aún más pequeña dentro de ella, hasta llegar a una muñeca rusa tan pequeña que ya no puede
contener otra.

El objetivo primordial de la recursividad es descomponer el problema en uno mas


pequeño hasta llegar a un caso base que la función puede resolver.
Estructura general

Caso base

Método recursivo

Invocación recurrente
Clasificación
▪ Recursividad directa

Si una función, procedimiento o método se invoca a sí misma, el proceso


se denomina recursión directa.

▪ Recursividad indirecta o mutua

Si una función, procedimiento o método puede invocar a una segunda


función, procedimiento o método que a su vez invoca a la primera, el
proceso se conoce como recursión indirecta.
Ventajas
▪Existen numerosos problemas que poseen
naturaleza recursiva, y en consecuencia, son mas
fáciles de implementar con algoritmos de este tipo.
▪En la mayoría de los casos, el uso de la recursión
permite a los programadores especificar soluciones
sencillas e intuitivas, que en serían en caso contrario,
extremadamente difíciles de resolver.
▪Para algunos casos, el código recursivo es simple y
legible a la vista.
▪Es considerada en la programación y en las
matemáticas como una herramienta poderosa e
importante para la resolución de problemas.
Desventajas
▪Cuando la recursión es usada como alternativa a la
iteración, la solución recursiva es normalmente
menos eficiente*.
▪Una mala implementación de la recursión puede
resultar aun más ineficiente (tiempo de ejecución).
▪No se recomienda su uso en sistemas embebidos, ya
que emplean una gran porción de la pila de llamadas
(con riesgo de un desbordamiento de pila).
▪ Se requieren conocer ciertas técnicas de diseño
para una correcta implementación.
▪Un diseño incorrecto puede resultar en un caso de
recursión infinita.

* Existen casos excepcionales para los cuales esto no se cumple.


Características de una correcta
implementación
El diseño detallado de un algoritmo recursivo es vital para
una correcta implementación.
▪Cuando la recursión es usada apropiadamente, resulta
complicado convertir la lógica resultante en una simple
estructura tipo bucle.
▪Debe existir al menos una sentencia en la función
recursiva que no implique a dicha función. Dicha
sentencia se conoce como caso base y tiene la finalidad
de detener la cadena de llamadas recursivas.

La recursividad se debe usar SOLO cuando


sea realmente necesaria, es decir, cuando
no exista una solución iterativa simple.
Directrices generales
1. Considérese una solución recursiva solo cuando una solución iterativa sencilla no sea posible.
2. Utilícese una solución recursiva solo cuando la ejecución y eficiencia de la memoria de la
solución este dentro de los limites aceptables considerando las limitaciones del sistema.
3. Si son posibles dos soluciones, iterativa y recursiva, la solución recursiva siempre requerirá
mas tiempo y espacio debido a las llamadas adicionales que se realizan.*
4. En ciertos problemas, la recursión conduce naturalmente a soluciones que son mucho mas
fáciles de leer y comprender que su correspondiente iterativa. En estos casos, los beneficios
con la claridad de la solución suelen compensar el coste extra (en tiempo y en memoria) de
la ejecución de un programa recursivo.
Complejidad computacional
▪Dependerá del algoritmo recursivo que se este analizando. Ejemplos típicos son:
Algoritmo Tiempo de ejecución
Búsqueda binaria recursiva 𝑂(log 𝑁)
Quicksort 𝑂(𝑁 log 𝑁)
Torres de Hanoi 𝑂(2𝑁 )

▪Para algoritmos recursivos basados en la estrategia divide-y-vencerás, se tiene el Teorema


Maestro que permite realizar el análisis asintótico a manera de receta.

𝑓 𝑁 = Θ 𝑁 𝑑 , 𝑑𝑜𝑛𝑑𝑒 𝑑 ≥ 0, 𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠
𝑁 ▪ 𝑇 𝑁 = Θ 𝑁 𝑑 𝑠𝑖 𝑎 < 𝑏 𝑑 ,
𝑇 𝑁 = 𝑎𝑇 + 𝑓(𝑁)
𝑏 ▪ 𝑇 𝑁 = Θ 𝑁 𝑑 log 𝑁 𝑠𝑖 𝑎 = 𝑏 𝑑 ,
▪ 𝑇 𝑁 = Θ 𝑁 log𝑏 𝑎 𝑠𝑖 𝑎 > 𝑏 𝑑 .
Problemas sencillos
▪ Factorial de un número

▪ Serie de Fibonacci

Otras aplicaciones:
▪ Exponenciación (enteros)
▪ Suma de los primeros N enteros positivos
▪ Cálculo del mcd (máximo común divisor)
Problemas complejos
▪ Torres de Hanoi

▪ Búsqueda binaria
recursiva
Algoritmos de ordenamiento
▪ MergeSort
Emplea la estrategia divide-y-vencerás. Esta es una
de esas aplicaciones donde la recursividad resulta
mas eficiente (para un tamaño de entrada grande)
con respecto a algoritmos de ordenamiento
iterativos (i.e. ordenamiento por inserción).

▪ QuickSort
Posiblemente, este algoritmo es el más pequeño de
código, más rápido, más elegante y eficiente de los
algoritmos conocidos de ordenación (solo para un
tamaño de entrada pequeño).
Referencias bibliográficas
[1] L. J. Aguilar, “Fundamentos de programación”, 4th. Ed. Madrid: McGraw-Hill, 2008.
[2] T. Cormen, et al., “Introduction to algorithms”, 3rd Ed. Cambridge: The MIT Press, 2009.
[3] M. A. Weiss, “Data estructures and algorithm analysis in C++”, 4th. Ed. New Jersey: Pearson,
2014.

Das könnte Ihnen auch gefallen