8-Recursividad

6
 EDA I Recursividad Recursividad 2 EDA I Recursión Un método es recursivo si se invoca a sí mismo o invoca a otros métodos que, de manera directa o indirecta, le invocan a él. El diseño recursivo debe contemplar los casos básicos y los casos generales del problema Recursividad 3 EDA I 3.7.- Programas recursivos Todo programa recursivo tiene al menos dos ramas de condicional: Caso simple (uno o más) Caso inductivo (uno o más) Los casos simples resuelven el problema para un subconjunto de los datos cuya solución es directa (sin recursión) Los casos inductivos resuelven el problema para sus datos en función de su solución para otros datos más próximos (en algún sentido) a los simples . (Recuérdese: Metodología de la programación)  Recursividad 4 EDA I Ejemplo: Sumatorio publ ic int suma (i nt num) { int resul t; if (num == 1) resul t = 1; else result = num + suma (num-1); ret urn result; } k=1 N Σ k= N+ Σ k=1 N-1 k

description

algebra

Transcript of 8-Recursividad

  • EDA I

    Recursividad

    Recursividad 2

    EDA I

    Recursin

    Un mtodo es recursivo si se invoca a smismo o invoca a otros mtodos que, de manera directa o indirecta, le invocan a l. El diseo recursivo debe contemplar los

    casos bsicos y los casos generales del problema

    Recursividad 3

    EDA I

    3.7.- Programas recursivosTodo programa recursivo tiene al menos dos ramas

    de condicional: Caso simple (uno o ms) Caso inductivo (uno o ms)

    Los casos simples resuelven el problema para un subconjunto de los datos cuya solucin es directa (sin recursin)

    Los casos inductivos resuelven el problema para sus datos en funcin de su solucin para otros datos ms prximos (en algn sentido) a los simples.

    (Recurdese: Metodologa de la programacin)

    Recursividad 4

    EDA I

    Ejemplo: Sumatorio

    public int suma (int num) {int result;if (num == 1)

    result = 1;else

    result = num + suma (num-1);return result;

    }

    k=1

    N k = N + k=1

    N-1

    k

  • Recursividad 5

    EDA I

    Induccin

    La clave para disear algoritmos recursivos es aplicar induccin. Demostracin por induccin:

    P(0) y P(n) P(n+1) n0 P(n)

    Caso bsico Hiptesis de induccin

    Recursividad 6

    EDA I

    Definiciones recursivas

    Conjunto de nmeros naturales Nat 0 Nat n Nat s(n) Nat

    Obsrvese el paralelismo entre esta definicin recursiva y la regla de demostracin por induccin

    Recursividad 7

    EDA I

    Ms definiciones recursivas

    Listas de elementos de clase T ListaDeT (lista vaca) L ListaDeT y t T t L ListaDeT

    Induccin estructural: P() y P(L) P(t L ) L ListaDeT P(L)

    primero resto

    Caso bsico Hiptesis de induccin

    Recursividad 8

    EDA I

    Torres de Hanoi

  • Recursividad 9

    EDA I

    Bsqueda dicotmica

    Un array ordenado permite la bsqueda dicotmica

    Recursividad 10

    EDA I

    Anlisis de algoritmos recursivos

    Expansin de la recurrencia que define la funcin de coste: Sumatorio: f(n) = (1) + f(n-1) Hanoi: g(n) = (1) + 2 g(n-1) Bsqueda dicotmica: h(n) = (1) + h(n/2)

    Recursividad 11

    EDA I

    Recorrido en un laberinto

    public boolean traverse (row, column) {if (row y column es la salida)

    return trueelse

    para cada casilla (f, c) accesible desde (row, column)if ((f, c) es vlida)

    Marcar (f, c)salida = traverse (f, c)if (not salida) Desmarcar (f , c)else return true

    finparareturn false

    }

    Recursividad 12

    EDA I

    Implementacin recursiva de ListaTAD

    La clase de los nodos NodoListaRec es indirectamente autoreferente

    public class NodoListaRec {public T dato;public ListaRec sigte;

    public NodoListaRec (T info, ListaRec lista){dato = info;sigte = lista;

    }}

  • Recursividad 13

    EDA I

    ListaRecTAD

    public class ListaRec implements ListaTAD {private NodoListaRec primero;

    public ListaRec (){primero = null;

    }

    public ListaRec(T dato){primero = new NodoListaRec(dato, new ListaRec());//alternativa?: primero = new NodoListaRec(dato, null);//Incorrecto, porque entonces el resto no es una ListaRec//y entonces, por ejemplo, sera incorrecto resto.isEmpty()

    }

    public ListaRec(T dato, ListaRec resto){primero = new NodoListaRec(dato,resto);

    }

    Lista vaca

    Lista con un elemento

    Recursividad 14

    EDA I

    isEmpty, inicio y resto

    //Devuelve true si esta lista no contiene ningn elementopublic boolean isEmpty (){

    return (primero == null);}

    //Para gestionar la induccin estructural: inicio y resto//Devuelve una referencia al principio de la listaprivate NodoListaRec inicio (){

    return primero;}

    //Devuelve una referencia al resto de la lista//Se supone que la lista es no vacaprivate ListaRec resto (){

    return primero.sigte;}

    Recursividad 15

    EDA I

    first y last

    //Devuelve una referencia al dato del primer elemento de la lista//Se supone que la lista no est vacapublic T first (){

    return primero.dato; //alternativa: return inicio().dato}

    //Devuelve una referencia al dato del ltimo elemento de la lista//Se supone que la lista no est vacapublic T last (){

    if (resto().isEmpty())return first();

    elsereturn resto().last();

    }

    Recursividad 16

    EDA I

    size y contains

    //Devuelve el nmero de elementos de la listapublic int size (){

    if ( isEmpty() )return 0;

    elsereturn 1 + resto().size();

    }

    //Devuelve true si esta lista contiene el elemento especificadopublic boolean contains (T target){

    if (isEmpty())return false;

    elseif (inicio().dato.equals(target))

    return true;else

    return resto().contains(target);

    }

  • Recursividad 17

    EDA I

    removeFirst y removeLast

    //Elimina y devuelve el primer elemento de la lista//Se supone que la lista no es vacapublic T removeFirst(){

    T temp = inicio().dato; //alternativa: temp = primero.dato;primero = resto().primero; //alternativa: primero=primero.sigte.primero;return temp;

    }

    //Elimina y devuelve el ltimo elemento de la lista//Se supone que la lista no es vacapublic T removeLast(){

    if (resto().isEmpty()){T temp = inicio().dato;primero = resto().primero; return temp;

    }else return resto().removeLast();

    }

    Recursividad 18

    EDA I

    remove y addToFront

    //Elimina y devuelve el elemento especificado de la listapublic T remove (T element){

    if (isEmpty())return null;

    else if (first().equals(element))return removeFirst();

    elsereturn resto().remove(element);

    }

    //Aade el elemento especificado al principio de la listapublic void addToFront (T element){

    NodoListaRec temp = new NodoListaRec(element, new ListaRec());

    temp.sigte.primero = this.primero;primero = temp;

    }

    Recursividad 19

    EDA I

    iterator y displayList

    //Devuelve un iterador para los elementos de la listapublic Iterator iterator(){

    return new IteradorListaRec(primero); }

    //Imprime los valores de la listapublic void displayList (){

    System.out.print("List (first-->last): ");displayListRec();System.out.println("");

    }

    public void displayListRec (){if (!isEmpty()){

    System.out.print( first().toString()+ " ");resto().displayListRec();

    }}

    Recursividad 20

    EDA I

    Iterador para ListaRec

    import java.util.*;

    public class IteradorListaRec implements Iterator {

    private NodoListaRec current; // la posicin actual

    //Inicializa el iterador utilizando los elementos especificadospublic IteradorListaRec (NodoListaRec collection){

    current = collection;}

    // Devuelve true si el iterador tiene al menos un elemento ms// que puede devolver como parte de la iteracinpublic boolean hasNext(){

    return ( current != null);}

    // Devuelve el siguiente elemento de la iteracin. public T next(){

    T result = current.dato;current = current.sigte.inicio();return result;

    }}

  • Recursividad 21

    EDA I

    Lectura

    De [Lewis, Chase 2006] Captulo 10