recursividad-carla_vairetti.pdf

45
Recursi´ on Recursividad en Java Resumen IIC1103 - Introducci´ on a la Programaci´ on - S1 Recursi´ on Carla Vairetti [email protected] Pontif´ ıcia Universidad Cat´ olica 27 de Mayo de 2010 Euclides IIC1103 - Introducci´ on a la Programaci´ on - S1

Upload: cieloci

Post on 07-Nov-2015

223 views

Category:

Documents


1 download

TRANSCRIPT

  • RecursionRecursividad en Java

    Resumen

    IIC1103 - Introduccion a la Programacion - S1Recursion

    Carla [email protected]

    Pontifcia Universidad Catolica

    27 de Mayo de 2010

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    Esquema

    1 RecursionMotivacion

    2 Recursividad en JavaEjemplosEjemplos para pensar

    3 Resumen

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    Esquema

    1 RecursionMotivacion

    2 Recursividad en JavaEjemplosEjemplos para pensar

    3 Resumen

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    Esquema

    1 RecursionMotivacion

    2 Recursividad en JavaEjemplosEjemplos para pensar

    3 Resumen

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    ResumenMotivacion

    Esquema

    1 RecursionMotivacion

    2 Recursividad en JavaEjemplosEjemplos para pensar

    3 Resumen

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    ResumenMotivacion

    Motivacion

    Definicion

    Una definicion Recursiva se establece un hecho en terminos delmismo hecho que se esta definiendo.

    La definicion involucra:

    Un Caso Base, en el que se definen los hechos mas simples, y

    Un Caso recursivo en el que se definen hechos mascomplejos a partir de los simples.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    ResumenMotivacion

    Motivacion

    Imagen recursiva formada por un triangulo. Cada trianguloesta compuesto de otros mas pequenos, compuestos a su vez de lamisma estructura recursiva.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    ResumenMotivacion

    Motivacion

    Definicion

    Recursion o recursividad es la forma en la cual se especifica unproceso basado en su propia definicion.

    Ejemplo

    Un ejemplo de conjunto definido de forma recurrente es el de losnumeros naturales:

    Si 0 pertenece a N

    Si n pertenece a N, entonces n-1 pertenece a N

    Los numeros naturales es el conjunto de numeros enteros positivos.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    ResumenMotivacion

    Ejemplos

    Pensemos en elfactorial de un numero.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    ResumenMotivacion

    Ejemplos

    Factorial de un numero.

    Definicion RecursivaBASE : 1! = 1RECURSIVIDAD: n!= n x (n-1)!

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    ResumenMotivacion

    Ejemplos: Factorial

    Con esta definicion veamos como funciona esta funcion para elvalor 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!= 3 x 2 x 1 x 1= 6

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Recursividad en Java

    En java un metodo recursivo lleva a cabo alguna tareautilizando llamados al mismo metodo se utiliza a s mismopara completar una tarea.

    El uso de parametros es fundamental para implementar unmetodo recursivo

    Permiten distinguir el caso base y el paso de recursividad.

    De esta forma repetiremos llamados a un mismo metodo condistintos parametros hasta encontrar algun caso base.

    Por esta razon, la recursividad se utiliza como una alternativapara la iteracion.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Recursividad en Java

    Para implementar un metodo recursivo es necesario estableceruno o mas casos base, cuya solucion es expedita, sin mayorprocesamiento. En estos casos es que la recursividad sedetendra y no se haran mas llamados al metodo.

    Asimismo, es necesario definir la forma en que los problemasmas complejos pueden resolverse en terminos de un problemamas simple, es decir, el paso de recursividad.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Recursividad en Java

    Por lo general, los metodos recursivos van a tener la siguienteforma:

    Ejemplo

    if (caso-base)resuelvalo

    else {redefina el problema utilizando recursividady la solucion de un problema mas simple

    }

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Esquema

    1 RecursionMotivacion

    2 Recursividad en JavaEjemplosEjemplos para pensar

    3 Resumen

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplo factorial

    Ejemplo

    public long Factorial(int n) {if (n == 1) {

    return(1);}else {

    return(n x Factorial(n-1));}

    }

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos

    Pensemos en lapotencia de un numero.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos

    Potencia de un numero.

    n=0! 1

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

    Potencia(x,n)

    Definicion RecursivaBASE : 1RECURSIVIDAD: x*Potencia(x,n-1)

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos 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 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos

    Pensemos en ladivision enteraentre numeros.

    14 : 3 = ?

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos

    Pensemos en la division entera entre numeros.

    b>a! 0 a=b!1

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

    div(a,b)

    Ejemplo

    14 : 3 = ?14 - 3 = 1111 - 3 = 88 - 3 = 55 - 3 = 2

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos 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 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos

    Pensemos en fibonacci de un numero.

    n=0! 0 n=1!1

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

    Fib(n)

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos 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 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplo fibonacci

    Fib(5)

    Fib(4) Fib(3)

    Fib(2) Fib(3) Fib(1) Fib(2)

    Fib(0) Fib(1) Fib(1) Fib(2) Fib(0) Fib(1)

    Fib(0) Fib(1)

    0 1

    1

    1

    2

    0 1

    1

    3

    0 1

    1

    1

    2

    5

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Esquema

    1 RecursionMotivacion

    2 Recursividad en JavaEjemplosEjemplos para pensar

    3 Resumen

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplo palndrome

    Un palndromo es una palabra que se escribe igual tanto deizquierda a derecha como al reves.

    Ejemplo

    ALA ALLA SACAS ANANA

    X Y

    X Es palndromo

    X Es palndromo si X==Y Y

    Si X==Y ver si Z es palndromo

    Z

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplo Palindrome

    Ejemplo

    public class Palindrome {private String pal;public Palindrome(String initPal) {

    pal = initPal.toUpperCase();}public boolean isPalindrome() {

    ...}

    }

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplo Palindrome

    Ejemplo

    public boolean isPalindrome(){if (pal.length()

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos 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 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos

    Pensemos en la sumade los N primeros

    numeros

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos

    Pensemos en la suma de los N primeros numeros.

    n=1 ! 1

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

    Suma(n)

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    Las Torres de Hanoi es un rompecabezas o juego matematicoinventado en 1883 por el matematico frances Eduard Lucas.

    Consiste en tres varillas verticales y un numero indeterminadode discos que determinaran la complejidad de la solucion.

    No hay dos discos iguales, estan colocados de mayor a menoren la primera varilla ascendentemente, y no se puede colocarningun disco mayor sobre uno menor a el en ningun momento.

    El juego consiste en pasar todos los discos a la tercera varillacolocados de mayor a menor ascendentemente.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    Las reglas son:

    Solo se puede mover un disco cada vez.

    Un disco de mayor tamano no puede descansar sobre uno maspequeno que el mismo.

    Solo puedes desplazar el disco que se encuentre arriba en cadavarilla.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    As:

    1 Para 1 disco hace falta 1 movimiento

    2 Para 2 discos hacen falta 3 movimientos

    3 Para 3 discos hacen falta 7 movimientos

    4 Para 4 discos hacen falta 15 movimientos

    La formula para encontrar el numero de movimientosnecesarios para transferir n discos del poste A al poste C es:2n 1.A partir de esta formula puede verse que si a los sacerdotesles tomaba tan solo un segundo hacer un movimiento, en totalgastaran 264 1 segundos, es decir, 584.942.417.355 anos.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Ejemplos: Torre de Hanoid

    Ejemplo

    public void torresDeHanoid(int N, //numero de discosint de, //estaca de origenint hacia, //estaca de destinoint 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 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Busqueda Binaria

    RestriccionLos elementos de la lista deben estar previamente ordenados.

    Algoritmo (asumiento orden ascendente)1 Si el largo de la lista es 0 el programa termina.2 Se calcula el ndice del elemento central.3 Se compara el elemento buscado con el elemento central.

    1 Si el elemento buscado es mayor al central, se vuelve al paso1, pero con la sublista [central + 1, largo].

    2 Si el elemento buscado es menor al central, se vuelve al paso1, pero con la sublista [0, central 1].

    3 Si el elemento buscado es igual al central se retorna el ndicede este. Encontro el elemento.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Busqueda Binaria

    Declaracion

    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 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    EjemplosEjemplos para pensar

    Busqueda Binaria

    Como lo transformamos a un proceso recursivo?Nos alcanzan los parametros?

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    Resumen

    Recursion o recursividad es la forma en la cual se especificaun proceso basado en su propia definicion.

    Una definicion Recursiva se establece un hecho en terminosdel mismo hecho que se esta definiendo.

    La definicion involucra:Un Caso Base, en el que se definen los hechos mas simples, yUn Caso recursivo en el que se definen hechos mas complejosa partir de los simples.

    Euclides IIC1103 - Introduccion a la Programacion - S1

  • RecursionRecursividad en Java

    Resumen

    Consultas

    Euclides IIC1103 - Introduccion a la Programacion - S1