You are on page 1of 27

Pontificia Universidad Catlica de Chile

Escuela de Ingeniera
Departamento de Ciencia de la Computacin
Ral Montes T.
Recursin
Otra forma de repetir operaciones
1
Muchas veces necesitamos repetir operaciones
public static int factorial(int n) {
int resultado = 1;
for (int i = n; i > 1; i--) {
resultado *= i;
}
return resultado;
}
2
Hay otras formas de repetir operaciones
Y tiene mucha relacin con la induccin matemtica
3
Necesitamos:
Un (o ms) caso base conocido
Una demostracin para el caso n en trminos
del caso n - 1 (u otros menores que n)
4
no lo s, pero es 1 ms que la
casa del lado
Queremos conocer el nmero de la casa de la derecha
Cul es el nmero
de esta casa?
2
Es el 2!
5
Factorial
Y que 0! = 1
Sabemos que n! = n * (n - 1)!
6
En cdigo
public static int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
En casa paso, reducimos el problema a otro de la
misma naturaleza, pero ms simple
En algn punto, debemos poder resolver el
problema sin necesitar reducirlo nuevamente
7
Factorial
fact(10)
10 * fact(9)
9 * fact(8)
8 * fact(7)
7 * fact(6)
6 * fact(5)
5 * fact(4)
4 * fact(3)
3 * fact(2)
2 * fact(1)
1 * fact(0)
1
= 1
= 2
= 6
= 24
= 120
= 720
= 5.040
= 40.320
= 362.880
= 3.628.800
= 3.628.800
8
public static int factorial(int n) {
int resultado = 1;
for (int i = n; i > 1; i--) {
resultado *= i;
}
return resultado;
}
Comparemos
public static int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
operacin que se repite
9
Desventajas
Usa muchos ms recursos
Es ms lento
Ventajas?
Es ms fcil de programar?
Es ms bonito?
public static int factorial(int n) {
if (n == 0) {
return 1;
}
return n * factorial(n - 1);
}
En general, los problemas se pueden resolver tanto con
recursin como con iteracin
10
Entonces Para qu nos sirve la recursin?
11
Algunos problemas son de naturaleza
recursiva, por lo que una solucin recursiva
ser mucho ms sencilla que una iterativa
Aunque incluso as resulte menos eciente, una
solucin recursiva puede ser mucho ms entendible,
mantenible y elegante que una solucin iterativa
12
Para encender motores
13
F
0
= 0
F
1
= 1
F
2
= F
1
+ F
0
= 1
F
3
= F
2
+ F
1
= 3
F
4
= F
3
+ F
2
= 5
...
F
n
= F
n-1
+ F
n-2
Serie de Fibonacci
0 1 1 2 3 5 8 13 21 34
14
Serie de Fibonacci
public static int fib(int n) {
if (n <= 1) {
return n;
}
return fib(n - 1) + fib(n - 2);
}
15
Para calentar motores
16
Ordenando un arreglo
Veamos el arreglo de una forma
ligeramente diferente
Un arreglo es un elemento seguido de un arreglo
17
Ordenando un arreglo
Si tenemos un elemento sabemos insertarlo en un
arreglo que ya est ordenado?
Programemos esto
18
Pero en estos casos, no hay ninguna razn para usar
recursin
Veamos algunos en que s vale la pena
19
Ejemplo: de cuntas formas diferentes se puede
entregar un vuelto en monedas?
Pero antes
20
Backtracking
Hay problemas que consisten en tomar una serie de
decisiones en las que en cada punto hay varias opciones
Algunas series de decisiones nos llevar al xito
Pero otras no nos darn el resultado esperado
Qu tal si vamos probando las series y viendo si son
exitosas o no, pero ordenadamente?
21
Backtracking
FAIL!
FAIL!
FAIL!
FAIL!
EPIC WIN!
22
Ejemplo: de cuntas formas diferentes se puede
entregar un vuelto en monedas?
Ahora s
23
Ejemplo: pintar con
24
Ejemplo: MergeSort
25
Ejemplo: Connect 4 (con MinMax simplicado)
26
En recursin, debemos tener presente que:
Cada llamada recursiva debe simplicar la solucin de
alguna forma
Existen casos base que podemos manejar sin recursin
27

You might also like