Está en la página 1de 45

Recursi

on
Recursividad en Java
Resumen

IIC1103 - Introduccion a la Programacion - S1


Recursi
on
Carla Vairetti
cvairetti@gmail.com
Pontifcia Universidad Cat
olica
27 de Mayo de 2010

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Esquema

Recursi
on
Motivaci
on

Recursividad en Java
Ejemplos
Ejemplos para pensar

Resumen

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Esquema

Recursi
on
Motivaci
on

Recursividad en Java
Ejemplos
Ejemplos para pensar

Resumen

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Esquema

Recursi
on
Motivaci
on

Recursividad en Java
Ejemplos
Ejemplos para pensar

Resumen

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Motivaci
on

Esquema

Recursi
on
Motivaci
on

Recursividad en Java
Ejemplos
Ejemplos para pensar

Resumen

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Motivaci
on

Motivacion

Definici
on
Una definici
on Recursiva se establece un hecho en terminos del
mismo hecho que se est
a definiendo.
La definici
on involucra:
Un Caso Base, en el que se definen los hechos m
as simples, y
Un Caso recursivo en el que se definen hechos m
as
complejos a partir de los simples.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Motivaci
on

Motivacion
Imagen recursiva formada por un tri
angulo. Cada tri
angulo
est
a compuesto de otros m
as peque
nos, compuestos a su vez de la
misma estructura recursiva.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Motivaci
on

Motivacion
Definici
on
Recursi
on o recursividad es la forma en la cual se especifica un
proceso basado en su propia definici
on.
Ejemplo
Un ejemplo de conjunto definido de forma recurrente es el de los
n
umeros naturales:
Si 0 pertenece a N
Si n pertenece a N, entonces n-1 pertenece a N
Los n
umeros naturales es el conjunto de n
umeros enteros positivos.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Motivaci
on

Ejemplos

Pensemos en el
factorial de un numero.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Motivaci
on

Ejemplos

Factorial de un n
umero.

Definici
on Recursiva
BASE : 1! = 1
RECURSIVIDAD: n!= n x (n-1)!

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Motivaci
on

Ejemplos: Factorial
Con esta definici
on veamos como funciona esta funci
on para el
valor del factorial de 3:
Ejemplo
3! = 3 x (3-1)!
= 3 x 2!
= 3 x 2 x (2-1)!
= 3 x 2 x 1!
= 3 x 2 x 1 x (1-1)!
= 3 x 2 x 1 x 0!
=3x2x1x1
=6

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Recursividad en Java

En java un metodo recursivo lleva a cabo alguna tarea


utilizando llamados al mismo metodo se utiliza a s mismo
para completar una tarea.
El uso de par
ametros es fundamental para implementar un
metodo recursivo
Permiten distinguir el caso base y el paso de recursividad.

De esta forma repetiremos llamados a un mismo metodo con


distintos par
ametros hasta encontrar alg
un caso base.
Por esta raz
on, la recursividad se utiliza como una alternativa
para la iteraci
on.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Recursividad en Java

Para implementar un metodo recursivo es necesario establecer


uno o m
as casos base, cuya soluci
on es expedita, sin mayor
procesamiento. En estos casos es que la recursividad se
detendr
a y no se har
an m
as llamados al metodo.
Asimismo, es necesario definir la forma en que los problemas
m
as complejos pueden resolverse en t
erminos de un problema
m
as simple, es decir, el paso de recursividad.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Recursividad en Java

Por lo general, los metodos recursivos van a tener la siguiente


forma:
Ejemplo
if (caso-base)
resuelvalo
else {
redefina el problema utilizando recursividad
y la soluci
on de un problema m
as simple
}

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Esquema

Recursi
on
Motivaci
on

Recursividad en Java
Ejemplos
Ejemplos para pensar

Resumen

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo factorial

Ejemplo
public long Factorial(int n) {
if (n == 1) {
return(1);
}
else {
return(n x Factorial(n-1));
}
}

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos

Pensemos en la
potencia de un numero.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos

Potencia de un n
umero.

Potencia(x,n)

n=0! 1
n>0! x*Potencia(x,n-1)

Definici
on Recursiva
BASE : 1
RECURSIVIDAD: x*Potencia(x,n-1)

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo potencia

Ejemplo
public long potencia(long x, int n) {
if (n == 0) {
return(1);
}
else {
return(x*potencia(x,n-1));
}
}

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos

Pensemos en la
division entera
entre numeros.
14 : 3 = ?

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos
Pensemos en la divisi
on entera entre n
umeros.

div(a,b)

b>a! 0
a=b!1
a>b! 1+div(a-b,b)

Ejemplo
14 : 3 = ?
14 - 3 = 11
11 - 3 = 8
8-3=5
5-3=2
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo division entera


Ejemplo
public int div(int a, int b) {
int res=0;
if (b >a) {
res= 0;
}
if (a == b) {
res= 1;
}
if (a > b) {
res=1+div(a-b,b);
}
return res;
}
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos

Pensemos en fibonacci de un n
umero.

Fib(n)

n=0! 0
n=1!1
n>1! Fib(n-1)+Fib(n-2)

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo fibonacci
Ejemplo
public int fibo(int n) {
int res=0;
if (n == 0) {
res= 0;
}
if (n == 1) {
res= 1;
}
if (n > 1) {
res=(fibo(n-1)+fibo(n-2));
}
return res;
}
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo fibonacci
Fib(5)

2
Fib(3)

Fib(4)
2
Fib(3)

1
Fib(2)

1
Fib(2)

Fib(1)
1

1
Fib(2)
Fib(1)
1

Fib(1)
1

Fib(1)
1

Fib(0)
0

Fib(1)
1

Fib(0)
0

Fib(0)
0
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Esquema

Recursi
on
Motivaci
on

Recursividad en Java
Ejemplos
Ejemplos para pensar

Resumen

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo palndrome
Un palndromo es una palabra que se escribe igual tanto de
izquierda a derecha como al reves.
Ejemplo
ALA ALLA SACAS ANANA

Y
Z
Es palndromo

X
Y

Si X==Y ver si Z es palndromo

Es palndromo si X==Y

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo Palindrome

Ejemplo
public class Palindrome {
private String pal;
public Palindrome(String initPal) {
pal = initPal.toUpperCase();
}
public boolean isPalindrome() {
...
}
}

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo Palindrome
Ejemplo
public boolean isPalindrome(){
if (pal.length() <= 1) { // solo 1 string
return true; // BASE CASE.
}
char first = pal.charAt(0);
char last = pal.charAt(pal.length()-1);
if (first ! = last) { // son diferentes
return false; // BASE CASE.
}else { //son las mismas letras
Palindrome sub = new Palindrome(
pal.substring(1,pal.length()-1));
return sub.isPalindrome(); // RECURSIVE CASE.
}
}
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplo Palindrome
Ejemplo
public static void main(String[] args) {
Palindrome p1 = new Palindrome(Madam);
System.out.println(p1.isPalindrome());
Palindrome p2 = new Palindrome(Nope!);
System.out.println(p2.isPalindrome());
Palindrome p3 = new Palindrome(dad);
System.out.println(p3.isPalindrome());
Palindrome p4 = new Palindrome(anana);
System.out.println(p4.isPalindrome());
}
false false true true
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos

Pensemos en la suma
de los N primeros
numeros

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos

Pensemos en la suma de los N primeros n


umeros.

Suma(n)

n=1 ! 1
n>1! n+Suma(n-1)

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid

Las Torres de Han


oi es un rompecabezas o juego matem
atico

inventado en 1883 por el matem


atico frances Eduard
Lucas.
Consiste en tres varillas verticales y un n
umero indeterminado
de discos que determinar
an la complejidad de la soluci
on.
No hay dos discos iguales, est
an colocados de mayor a menor
en la primera varilla ascendentemente, y no se puede colocar
ning
un disco mayor sobre uno menor a el en ning
un momento.
El juego consiste en pasar todos los discos a la tercera varilla
colocados de mayor a menor ascendentemente.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid


Las reglas son:
S
olo se puede mover un disco cada vez.
Un disco de mayor tama
no no puede descansar sobre uno m
as
peque
no que el mismo.
S
olo puedes desplazar el disco que se encuentre arriba en cada
varilla.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid


As:
1

Para 1 disco hace falta 1 movimiento

Para 2 discos hacen falta 3 movimientos

Para 3 discos hacen falta 7 movimientos

Para 4 discos hacen falta 15 movimientos


La f
ormula para encontrar el n
umero de movimientos
necesarios para transferir n discos del poste A al poste C es:
2n 1.

A partir de esta f
ormula puede verse que si a los sacerdotes
les tomaba tan s
olo un segundo hacer un movimiento, en total
nos.
gastaran 264 1 segundos, es decir, 584.942.417.355 a
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Ejemplos: Torre de Hanoid


Ejemplo
public void torresDeHanoid(
int N, //n
umero de discos
int de, //estaca de origen
int hacia, //estaca de destino
int reserva) //estaca media{
if (N == 1) {
mueveUno(de, hacia);
} else {
torresDeHanoid(N-1, de, reserva, hacia);
mueveUno(de, hacia);
torresDeHanoid(N-1, reserva, hacia, de);
}
}
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Busqueda Binaria

Restricci
on
Los elementos de la lista deben estar previamente ordenados.

Algoritmo (asumiento orden ascendente)


1
2
3

Si el largo de la lista es 0 el programa termina.


Se calcula el ndice del elemento central.
Se compara el elemento buscado con el elemento central.
1

Si el elemento buscado es mayor al central, se vuelve al paso


1, pero con la sublista [central + 1, largo].
Si el elemento buscado es menor al central, se vuelve al paso
1, pero con la sublista [0, central 1].
Si el elemento buscado es igual al central se retorna el ndice
de este. Encontr
o el elemento.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Busqueda Binaria
Declaraci
on
public int busquedaBinaria ( String [ ] lista , String buscado ) {
int inicial = 0;
int final = lista.length - 1;
while ( inicial < final ) {
int central = ( inicial + final )/2;
if( buscado.compareTo(lista[central]) > 0){
inicial = central + 1; }
else if( buscado.compareTo(lista [central]) < 0){
final = central - 1; }
else{ return central; }
}
return -1;
}
Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Ejemplos
Ejemplos para pensar

Busqueda Binaria

Como lo transformamos a un proceso recursivo?


Nos alcanzan los par
ametros?

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Resumen

Recursi
on o recursividad es la forma en la cual se especifica
un proceso basado en su propia definici
on.
Una definici
on Recursiva se establece un hecho en terminos
del mismo hecho que se est
a definiendo.
La definici
on involucra:
Un Caso Base, en el que se definen los hechos mas simples, y
Un Caso recursivo en el que se definen hechos mas complejos
a partir de los simples.

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1

Recursi
on
Recursividad en Java
Resumen

Consultas

Euclides

IIC1103 - Introducci
on a la Programaci
on - S1