Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructura de datos
Unidad 2
Recursividad
Profesora: Julia
Equipo: 4
Alumnos:
López del Castillo Álvarez Eduardo
Introduccion
La recursividad es una técnica muy utilizada en programación informática. Se suele utilizar
para resolver problemas cuya solución se puede hallar resolviendo el mismo problema, pero
para un caso de tamaño menor.
Cuando en informática se escribe un programa con un algoritmo recursivo, en las propias
sentencias del algoritmo hay una llamada a sí mismo, es decir una de las sentencias llama al
algoritmo recursivo en el que está insertada, aunque para solucionar un caso más sencillo.
Los métodos recursivos se pueden usar en cualquier situación en la que la solución pueda
ser expresada como una sucesión de pasos o transformaciones gobernadas por un conjunto
de reglas claramente definidas.
En un algoritmo recursivo podemos distinguir dos partes:
Base o problema trivial: que se puede resolver sin cálculo
Definicion
La recursividad es una técnica de programación que se utiliza para realizar una llamada a
una función desde ella misma, de allí su nombre. En Java, como en otros muchos lenguajes,
los métodos pueden llamarse a sí mismos. Gracias a esto, podemos utilizar a nuestro favor
la recursividad en lugar de la iteración para resolver determinados tipos de problemas.
Esta estrategia es una alternativa al uso de bucles. Una solución recursiva es, normalmente,
menos eficiente que una solución basada en bucles. Esto se debe a las operaciones
auxiliares que llevan consigo las llamadas a las funciones.
en muchas circunstancias el uso de la recursividad permite a los programadores especificar
soluciones naturales y sencillas que sin emplear esta técnica serían mucho más complejas
de resolver. Esto convierte a la recursión en una potente herramienta de la programación.
Sin embargo, por sus inconvenientes, debe emplearse con cautela.
Procedimientos recursivos
Para resolver un problema de forma recursiva se debe:
Descomponer el problema principal en alguna versión más simple, que puedas
resolver llamando a la propia función recursiva
Confiar en la recursión para resolver esta versión más simple del problema y que
va a devolver su solución, obtener la solución al problema completo a partir de la
solución de la versión más simple
La frase confía en la recursión quiere decir que cuando estés analizando el funcionamiento
de un programa recursivo y veas una llamada recursiva debes confiar en que esta llamada
va a devolver el resultado que se prentende.
Es útil escribir y pensar en los procedimientos recursivos de forma declarativa, teniendo en
cuenta lo que hacen y no cómo lo hacen. Es útil pensar en la formulación recursiva del
problema de una forma matemática, analítica o gráfica antes de ponerse a programar. Es
muy útil también probar con algunos ejemplos concretos.
¿Cuándo para el algoritmo? Cuando el problema es lo más simple posible y ya no se puede
simplificar más: este es el caso base. Debemos entonces devolver un valor concreto, la
recursión ya ha terminado.
El coste de la recursión
Hasta ahora hemos estudiado el diseño de funciones recursivas. Vamos a tratar por primera
vez su coste. Veremos que hay casos en los que es prohibitivo utilizar la recursión tal y
como la hemos visto. Y veremos también que existen soluciones para esos casos.
La pila de la recursión
Vamos a estudiar el comportamiento de la evaluación de una llamada a una función
recursiva. Supongamos la función mi-length:
Cada llamada a la recursión deja una función en espera de ser evaluada cuando la recursión
devuelva un valor (en el caso anterior las funciones suma). Estas llamadas en espera, junto
con sus argumentos, se almacenan en la pila de la recursión.
Cuando la recursión devuelve un valor, los valores se recuperan de la pila, se realiza la
llamada y se devuelve el valor a la anterior llamada en espera.
Si la recursión está mal hecha y nunca termina se genera un stack overflow porque la
memoria que se almacena en la pila sobrepasa la memoria reservada para el intérprete
DrRacket.
Coste espacial de la recursión
El coste espacial de un programa es una función que relaciona la memoria consumida por
una llamada para resolver un problema con alguna variable que determina el tamaño del
problema a resolver. En el caso de la función mi-length el tamaño del problema viene dado
por la longitud de la lista. El coste espacial de mi-lenght es O(n), siendo n la longitud de la
lista.
Uso de memoria. La aplicación tiene una cantidad limitada de espacio para las
variables locales. Cada vez que un procedimiento se llama a sí mismo, usa más
espacio para las copias adicionales de sus variables locales. Si este proceso continúa
indefinidamente, se produce un error de StackOverflowException.