Está en la página 1de 31

ALGORITMOS Y ESTRUCTURAS DE DATOS

Recursividad

AED-LSU 1
Agenda
• Recursión
• ¿ Cómo funciona la Recursión ?
• Las Torres de Hanoi
• Algoritmos Recursivos

AED - LSU 2
Matrushka
• La Matrushka es una artesanía tradicional rusa. Es
una muñeca de madera que contiene otra muñeca
más pequeña dentro de sí. Ésta muñeca, también
contiene otra muñeca dentro. Y así, una dentro de
otra.

3
Recursividad: el concepto
• La recursividad es un concepto fundamental en
matemáticas y en computación.
• Es una alternativa para implementar estructuras
repetitivas (for, while).
• Es una técnica de programación en la que un método
se llama a si mismo.
• La recursión permite definir un objeto (funciones,
problemas, estructuras de datos) en términos de sí
mismo.

4
Recursión
• Ejemplos:
f(0) = 0 y f(x) = 2 f(x-1) + x2

3! = 3 * 2!

– Son funciones que se definen en términos de si misma.

EDA - LSU 5
Recursión
La recursividad puede ser
Directa: Cuando el procedimiento se llama a si
mismo.

Proc. P

Llamada a P

EDA - LSU 6
Recursión
Indirecta Cuando la llamada no es directamente
a si mismo
Proc. P
Llamada a Q
Proc. P

Llamada a Q

Proc. Q
Proc. Q Llamada a V
Lamada a P
Llamada a P Proc. V
Llamada a Q
EDA - LSU 7
Recursividad
Para obtener una solución se deben cumplir las
siguientes condiciones:

– Caso base (Estado base, estado básico).- Es el valor


que permite obtener una solución directa, es la parte
que no es recursiva.
– Es necesario que exista para que la función recursiva
termine.
– Puede haber mas de un caso base

Informática
Recursividad
– Caso recursivo:
– Una solución que involucra volver a utilizar la función
original, con parámetros que se acercan más al caso
base.
– Progresión, la llamada recursiva siempre debe
tender al caso base

Informática
Recursividad
– Los pasos que sigue el caso recursivo son los
siguientes:
1. El procedimiento se llama a sí mismo
2. El problema se resuelve, tratando el mismo
problema pero de tamaño menor
3. La manera en la cual el tamaño del problema
disminuye asegura que el caso base
eventualmente se alcanzará

10
Recursión
Ejemplo: Factorial de n
Por definición n! = 1*2*3*…*(n-1)*n
con 0! = 1 y 1! = 1
3! = 3*2!
2! = 2*1!
1! = 1*0! Caso base
0! = 1
Generalizando: n! = 1 si n= 0
n*(n-1)! si n > 0

EDA - LSU 11
Recursión

EDA - LSU 12
Ejemplo
Pseudocodigo Java
Funcion factorial (n) public int factorial(int n){
si n = 0 int resultado;
entonces resultado = 1 if (n==0)
sino
resultado = 1;
resultado = n * Factorial(n-1)
else
Fsi
resultado = n*factorial(n-1);
Retornar resultado
Fin funcion return resultado;
}

13
Ejemplo en Java
public int factorial(int n){ public int factorial(int n){ public int factorial(int n){
int resultado; int resultado; int resultado;
if (n == 0) if (n == 0) if (n == 0)
resultado = 1; resultado = 1; resultado = 1;
else else else
resultado = n * factorial(n-1); resultado = n * factorial(n-1); resultado = n * factorial(n-1);
return resultado; } return resultado; } return resultado; }

public int factorial(int n){


int resultado;
if (n == 0)
resultado = 1;
else
resultado = n * factorial(n-1);
return resultado; }

14
¿Cómo funciona la recursividad?

15
Recursión
• La recursión
– Permite crear algoritmos claros y concisos
– Es costosa en tiempo de ejecución y espacio
usado
• La recursividad se puede simular usando
algoritmos iterativos.

EDA - LSU 16
Como funciona la Recursividad
• Regla de diseño para funciones recursivas
Suponga que todas las llamadas recursivas
funcionan

• Es importante porque al diseñar rutinas recursivas


no necesitamos conocer los detalles del
funcionamiento interno, siempre suponemos que
funciona correctamente

EDA - LSU 17
Como funciona la Recursividad

• La recursión tiene como principal problema el


costo oculto de su funcionamiento interno (control
de puntos de llamadas, control de puntos de
retorno, valores de retorno, etc.)

EDA - LSU 18
Ejemplo
Paso N Pila Factorial
0 4
1 4 4 4 * fact(3)
2 3 4, 3 3 * fact(2)
3 2 4, 3, 2 2 * fact(1)
4 1 4, 3, 2, 1 1 * fact(0)
5 0 4, 3, 2, 1 1
6 1 4, 3, 2 1 * fact(0) = 1*1 = 1
7 2 4, 3 2 * fact(1) = 2*1 = 2
8 3 4 3 * fact(2) = 3*2 = 6
9 4 4 * fact(3) = 4*6 = 24
EDA - LSU 19
Como funciona la Recursividad
Internamente se utiliza una estructura tipo pila
para guardar valores de variables y constantes
locales del programa o subprograma que efectúa
la llamada.

De esta manera, una vez concluida la ejecución,


se puede continuar la ejecución recuperando los
valores necesarios de la pila.

EDA - LSU 20
Como funciona la Recursividad
– Se guarda una referencia a la siguiente
instrucción a ejecutar.

– Al retornar se toma la imagen del tope de la


pila y se continúa operando.

– Esto se repite hasta que la pila esté vacía.

EDA - LSU 21
La alternativa iterativa
Metodo Factorial (n)
fact =1
mientras n > 0
fact =fact * n
n =n - 1
fmientras
retornar fact
Fin_metodo

EDA - LSU 22
Recursividad Indirecta
función Impar(N)
si n = 0 entonces Impar = falso
sino Impar = Par(N - 1)
finfunción
función Par(N)
si n = 0 entonces Par = falso
sino Par = Impar(N - 1)
Fin_función

EDA - LSU 23
Las Torres de Hanoi
Es un juego matemático que consiste en tres varillas
verticales y un número indeterminado de discos
que determinarán la complejidad de la solución.
No hay dos discos iguales y están colocados de
mayor a menor tamaño en una varilla, no se
puede colocar ningún disco mayor sobre uno
menor a él en ningún momento.

EDA - LSU 24
Las Torres de Hanoi
El juego consiste en pasar todos los discos de la
varilla A hacia la varilla C, colocados de mayor a
menor ascendentemente

Juego: http://www.uterra.com/juegos/torre_hanoi.htm

EDA - LSU 25
Recursividad de Cola

• La recursividad de cola, se presenta cuando se


usa solo una llamada recursiva en cada extremo
del método o modulo.
• En este caso la llamada recursiva es la ultima
sentencia del método y además es la única
llamada recursiva.

EDA - LSU 26
Recursividad de Cola
• Ejemplo:
public int fact(int n) {
if (n == 0)
return 1;
else
return fact(n - 1) * n;
}

EDA - LSU 27
Recursividad Anidada

• La recursividad anidada, se presenta cuando el


método se define en términos de si mismo y
además cuando se utiliza esta llamada como un
parámetro.
• Ejemplo:

EDA - LSU 28
Ejercicios

• Calcular la potencia de un numero


• Invierta un numero
• Convertir un numero de base 10 a base 2

EDA - LSU 29
Ejercicios
Construir el pseudocodigo para el siguiente caso
fi(x,y)= 0 si i = 0
fi(x,y) = - xy+1 + yx-2- xy+3+yx-4-…. Si i> 0

f4(x,y) = f3(x,y) + yx-4


f3(x,y) = f2(x,y) - xy+3
f2(x,y) = f1(x,y) + yx-2
f1(x,y) = f0(x,y) - xy+1
f0(x,y) = 0

EDA - LSU 30
Ejercicios
metodo funcionxy(i,x,y) →
si i = 0
entonces funcionxy = 0
sino si (i mod 2) = 0
entonces funcionxy=funcionxy(i-1,x,y)+yx-i
sino funcionxy=funcionxy(i-1,x,y)-xy+i
fsi
fsi
fmetodo

EDA - LSU 31

También podría gustarte