Está en la página 1de 11

Instituto Tecnológico de Veracruz

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

 Recursión: Fórmula da la solución del problema en función define de un problema


del mismo tipo más sencillo

La idea fundamental es que el


algoritmo se hace una llamada así
mismo.

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.

Consideraciones con procedimientos recursivos


Condiciones de limitación. Debe diseñar un procedimiento recursivo para probar al
menos una condición que pueda finalizar la recursividad, y también debe controlar
el caso en el que no se cumpla esa condición en un número razonable de llamadas
recursivas. Si no hay al menos una condición que pueda cumplirse sin errores, el
procedimiento ejecuta un alto riesgo de ejecutarse en un bucle infinito.

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.

Eficacia. Casi siempre se puede sustituir un bucle por recursividad. Un bucle no


tiene la sobrecarga de pasar argumentos, inicializar almacenamiento adicional y
devolver valores. El rendimiento puede ser mucho mejor sin llamadas recursivas.

Recursividad mutua. Es posible que observe un rendimiento muy deficiente, o


incluso un bucle infinito, si dos procedimientos se llaman entre sí. Este tipo de
diseño presenta los mismos problemas que un único procedimiento recursivo, pero
puede ser más difícil de detectar y depurar.

Llamar a con paréntesis. Cuando un procedimiento de Function se llama a sí


mismo de forma recursiva, debe seguir el nombre del procedimiento entre
paréntesis.

Ejemplos de casos recursivos


Pueden distinguirse distintos tipos de llamada recursivas dependiendo del número de
funciones involucradas y de cómo se genera el valor final.
 Recursión lineal
En la recursión lineal cada llamada recursiva genera, como mucho, otra llamada recursiva.
Se pueden distinguir dos tipos de recursión lineal atendiendo a cómo se genera resultado.
 Recursión lineal no final
En la recursión lineal no final el resultado de la llamada recursiva se combina en una
expresión para dar lugar al resultado de la función que llama. El ejemplo típico de recursión
lineal no final es cálculo del factorial de un número (n! = n * (n-1) * ...* 2 * 1 ). Dado que
el factorial de un número n es igual al producto de n por el factorial de n-1, lo más natural
es efectuar una implementación recursiva de la función factorial.
para calcular el factorial de 4 esta sería la secuencia de llamadas

Cada fila del anterior gráfico supone una


instancia distinta de ejecución de la función
fact. Cada instancia tiene un conjunto diferente
de variables locales.

 Recursión lineal final


En la recursión lineal final el resultado que es devuelto es el resultado de ejecución de la
última llamada recursiva. Un ejemplo de este cálculo es el máximo común divisor, que
puede hallarse a partir de la fórmula:
 Recursión múltiple
Alguna llamada recursiva puede generar más de una llamada a la función. Uno de los
centros más típicos son los números de Fibonacci, números que reciben el nombre del
matemático italiano que los descubrió. Estos números se calculan mediante la fórmula:
 Recursión mutua
Implica más de una función que se llaman mutuamente. Un ejemplo es el determinar si un
número es par o impar mediante dos funciones:
Conclusion
Bibliografia
Referencias
 CEU. (03 de Junio de 2016). Microsoft Word - TEMA 7.doc. Obtenido de
Metodologia y tecnologia de la investigacion :
http://biolab.uspceu.com/aotero/recursos/docencia/TEMA%207.pdf
 Departamento de Ciencia de la Computación e Inteligencia Artificial. (12 de
Septiembre de 2011). dccia. Obtenido de Procedimientos y estructuras recursivas:
http://www.dccia.ua.es/dccia/inf/asignaturas/LPP/2010-
2011/teoria/tema4.html#sec-2_1
 Esteso, M. P. (23 de marzo de 2014). geeky theory. Obtenido de ¿Qué es la
recursividad?: https://geekytheory.com/que-es-la-recursividad
 Gallardo, D. (10 de Enero de 2019). LLP. Obtenido de Tema 3: Procedimientos
recursivos¶: https://domingogallardo.github.io/apuntes-lpp/teoria/tema03-
procedimientos-recursivos/tema03-procedimientos-recursivos.html#coste-espacial-
de-la-recursion
 Microsoft. (20 de Julio de 2015). Microsoft. Obtenido de Procedimientos recursivos
(Visual Basic): https://docs.microsoft.com/es-es/dotnet/visual-basic/programming-
guide/language-features/procedures/recursive-procedures
 Senati. (13 de Diciembre de 2017). Sites google. Obtenido de Senati:
https://sites.google.com/site/portafoliosenati/fundamentos-de-programacion/13-
aplicar-recursividad

También podría gustarte