Está en la página 1de 16

Unidad 3.

Estructuras no lineales
3.1. Recursividad
Introduccin
Una funcin recursiva es aquella que se llama a s
misma.
La recursividad es una alternativa a la repeticin o
iteracin.
En tiempo de computadora y ocupacin de memoria,
la solucin recursiva es menos eficiente que la
iterativa, existen situaciones en las que la
recursividad es una solucin simple y natural a un
problema que en otro caso ser difcil de resolver
Definicin de un mtodo recursivo
La caracterstica principal de la recursividad es que
siempre existe un medio de salir de la definicin (caso
base o salida), y la segunda condicin (llamado
recursivo) es propiamente donde se llama a s misma.
Una funcin recursiva simple en Java es:
public void infinito ()
{
infinito ();
}
Definicin

De manera ms formal, una funcin recursiva es


invocada para solucionar un problema y dicha funcin
sabe cmo resolver los casos ms sencillo (casos bases).
Donde si la funcin es llamada desde un caso base, sta
simplemente devuelve el resultado.
Si es llamada mediante un problema ms complejo, la
funcin lo divide en dos partes conceptuales: una parte
de dicha funcin sabe resolver y otra que no sabe
resolver.
Definicin

Adems esta segunda parte debe parecerse al problema


en s; para tener la recursividad; pero debe ser ms
simple.
Debido a que se parece a la original la funcin lanza una
copia de ella misma, que se encargar del problema ms
sencillo (llamado recursivo o paso de recursin).
En esta parte se tendr la devolucin de un valor que era
desconocido inicialmente.
Ejemplo con recursividad
El factorial de un entero no negativo n, esta definido
como:
n! = n * (n-1) * (n-2) * *2 *1
Donde 1! es igual a 1 y 0! se define como 1.
El factorial de un entero k puede calcularse de manera
iterativa como sigue:
fact = 1;

for (int i = k; i>=1; i--)


fact *= i;
Ejemplo con recursividad
Ahora de manera recursiva se puede definir el factorial
como:
1 si n 0
n!
n * (n 1)! si n 0
Donde el caso base es: 1 Si n = 0.
El caso general es: n * (n-1)! Si n > 0.
Por ejemplo si se quiere calcular el factorial de 5, se
tendra:
5! = 5*4*3*2*1
5! = 5*(4*3*2*1)
5! = 5*4!
Ejemplo con recursividad
Valor devuelto 120
5! 5!
Se devuelve 5!=5*24=120
5* 4! 5* 4!
Se devuelve 4!=4*6=24
4* 3! 4* 3!
Se devuelve 3!=3*2=6
3* 2! 3* 2!
Se devuelve 2!=2*1=2
2* 1! 2* 1!
Se devuelve 1
1 1
Ejemplo con recursividad
Caso base: Es el caso ms simple de una funcin
recursiva, y simplemente devuelve un resultado (el caso
base se puede considerar como una salida no recursiva).

Caso general: Relaciona el resultado del algoritmo con


resultados de casos ms simples. Dado que cada caso de
problema aparenta o se ve similar al problema original, la
funcin llama una copia nueva de si misma, para que
empiece a trabajar sobre el problema ms pequeo y
esto se conoce como una llamada recursiva y tambin se
llama el paso de recursin.
Mtodo
1. Obtener una definicin exacta del problema a resolver.
(Esto, por supuesto, es el primer paso en la resolucin
de cualquier problema de programacin).
2. A continuacin, determinar el tamao del problema
completo que hay que resolver. Este tamao
determinar los valores de los parmetros en la
llamada inicial a la funcin.
3. Resolver el caso base en el que el problema puede
expresarse no recursivamente. Por ltimo, resolver el
caso general correctamente en trminos de un caso
ms pequeo del mismo problema, una llamada
recursiva.
Tipos de recursin
Recursividad simple: Aquella en cuya definicin slo
aparece una llamada recursiva. Se puede transformar
con facilidad en algoritmos iterativos.
Factorial

Recursividad mltiple: Se da cuando hay ms de una


llamada a s misma dentro del cuerpo de la funcin,
resultando ms difcil de hacer de forma iterativa.
Fibonacci
Tipos de recursin
Recursividad anidada: En algunos de los argumentos de
la llamada recursiva hay una nueva llamada a s misma.
Ackerman

Recursividad cruzada o indirecta: Son algoritmos donde


una funcin provoca una llamada a s misma de forma
indirecta, a travs de otras funciones. Es decir es aquella
en la que una funcin es llamada a otra funcin y esta a
su vez llama a la funcin que la llam.
Tipos de recursin
Ejemplo: Par o Impar
int par(int nump) {
if (nump==0)
return(1);
return( impar(nump-1)); }

int impar (int numi) {


if(numi==0)
return(0);
return( par(numi-1)); }
Recursin vs. Iteracin
Las principales cuestiones son la claridad y la eficiencia
de la solucin.
En general: Una solucin no recursiva es ms eficiente
en trminos de tiempo y espacio de computadora.
La solucin recursiva puede requerir gastos
considerables, y deben guardarse copias de variables
locales y temporales.
Aunque el gasto de una llamada a una funcin
recursiva no es peor, esta llamada original puede
ocultar muchas capas de llamadas recursivas internas.
El sistema puede no tener suficiente espacio para
ejecutar una solucin recursiva de algunos problemas.
Recursin vs. Iteracin
Una solucin recursiva particular puede tener una
ineficiencia inherente. Tal ineficiencia no es debida a
la eleccin de la implementacin del algoritmo; ms
bien, es un defecto del algoritmo en si mismo.
Un problema inherente es que algunos valores son
calculados una y otra vez causando que la capacidad
de la computadora se exceda antes de obtener una
respuesta.
La cuestin de la claridad en la solucin es, no
obstante, un factor importante.
En algunos casos una solucin recursiva es ms simple
y ms natural de escribir.
Referencia
Beltrn, B. (2015). Facultad de Ciencias de la Computacin,
BUAP. Notas de clase.

También podría gustarte