Está en la página 1de 6

EDA I

Recursin
EDA I

Recursividad

Un mtodo es recursivo si se invoca a s


mismo 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

EDA I

EDA I

3.7.- Programas recursivos

Ejemplo: Sumatorio

Todo programa recursivo tiene al menos dos ramas


de condicional:
(Recurdese: Metodologa
Caso simple (uno o ms)
de la programacin)
Caso inductivo (uno o ms)

k=1

Los casos simples resuelven el problema para un


subconjunto de los datos cuya solucin es directa
(sin recursin)

k = N +

k=1

public int suma (int num) {


int result;
if (num == 1)
result = 1;
else
result = num + suma (num-1);
return result;
}

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.
Recursividad

N-1

Recursividad

EDA I

EDA I

Induccin

Definiciones recursivas

La clave para disear algoritmos


recursivos es aplicar induccin.
Demostracin por induccin:

Conjunto de nmeros naturales Nat

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

Obsrvese el paralelismo entre esta


definicin recursiva y la regla de
demostracin por induccin

Caso bsico

0 Nat
n Nat s(n) Nat

Hiptesis de induccin

Recursividad

Recursividad

EDA I

EDA I

Ms definiciones recursivas

Torres de Hanoi

Listas de elementos de clase T


<> ListaDeT (lista vaca)
L ListaDeT y t T t L ListaDeT
primero

resto

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

Caso bsico
Recursividad

Hiptesis de induccin
7

Recursividad

EDA I

EDA I

Bsqueda dicotmica

Anlisis de algoritmos recursivos

Un array ordenado permite la bsqueda


dicotmica

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

Recursividad

EDA I

Implementacin recursiva de
ListaTAD<T>

Recorrido en un laberinto
public boolean traverse (row, column) {
if (row y column es la salida)
return true
else
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
finpara
return false
}

La clase de los nodos NodoListaRec<T> es


indirectamente autoreferente

Recursividad

Recursividad

11

10

EDA I

public class NodoListaRec<T> {


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

12

EDA I

EDA I

ListaRecTAD<T>

isEmpty, inicio y resto

public class ListaRec <T> implements ListaTAD<T> {


private NodoListaRec<T> primero;
public ListaRec (){
primero = null;
}

//Devuelve true si esta lista no contiene ningn elemento


public boolean isEmpty (){
return (primero == null);
}

Lista vaca

//Para gestionar la induccin estructural: inicio y resto

Lista con un elemento

//Devuelve una referencia al principio de la lista


private NodoListaRec<T> inicio (){
return primero;
}

public ListaRec(T dato){


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

//Devuelve una referencia al resto de la lista


//Se supone que la lista es no vaca
private ListaRec<T> resto (){
return primero.sigte;
}

public ListaRec(T dato, ListaRec<T> resto){


primero = new NodoListaRec<T>(dato,resto);
}

Recursividad

13

Recursividad

14

EDA I

EDA I

first y last

size y contains

//Devuelve una referencia al dato del primer elemento de la lista


//Se supone que la lista no est vaca
public T first (){
return primero.dato; //alternativa: return inicio().dato
}

//Devuelve el nmero de elementos de la lista


public int size (){
if ( isEmpty() )
return 0;
else
return 1 + resto().size();
}

//Devuelve una referencia al dato del ltimo elemento de la lista


//Se supone que la lista no est vaca
public T last (){
if (resto().isEmpty())
return first();
else
return resto().last();
}

//Devuelve true si esta lista contiene el elemento especificado


public boolean contains (T target){
if (isEmpty())
return false;
else
if (inicio().dato.equals(target))
return true;
else
return resto().contains(target);
}

Recursividad

15

Recursividad

16

EDA I

EDA I

removeFirst y removeLast

remove y addToFront

//Elimina y devuelve el primer elemento de la lista


//Se supone que la lista no es vaca
public T removeFirst(){
T temp = inicio().dato; //alternativa: temp = primero.dato;
primero = resto().primero; //alternativa: primero=primero.sigte.primero;
return temp;
}

//Elimina y devuelve el elemento especificado de la lista


public T remove (T element){
if (isEmpty())
return null;
else if (first().equals(element))
return removeFirst();
else
return resto().remove(element);
}

//Elimina y devuelve el ltimo elemento de la lista


//Se supone que la lista no es vaca
public T removeLast(){
if (resto().isEmpty()){
T temp = inicio().dato;
primero = resto().primero;
return temp;
}
else return resto().removeLast();

//Aade el elemento especificado al principio de la lista


public void addToFront (T element){
NodoListaRec<T> temp = new NodoListaRec<T>(element,
new ListaRec<T>());
temp.sigte.primero = this.primero;
primero = temp;
}

Recursividad

17

Recursividad

EDA I

EDA I

iterator y displayList

Iterador para ListaRec<T>

//Devuelve un iterador para los elementos de la lista


public Iterator<T> iterator(){
return new IteradorListaRec(primero);
}

import java.util.*;
public class IteradorListaRec<T> implements Iterator<T> {
private NodoListaRec<T> current; // la posicin actual
//Inicializa el iterador utilizando los elementos especificados
public IteradorListaRec (NodoListaRec<T> collection){
current = collection;
}

//Imprime los valores de la lista


public void displayList (){
System.out.print("List (first-->last): ");
displayListRec();
System.out.println("");
}

// Devuelve true si el iterador tiene al menos un elemento ms


// que puede devolver como parte de la iteracin
public boolean hasNext(){
return ( current != null);
}

public void displayListRec (){


if (!isEmpty()){
System.out.print( first().toString()+ " ");
resto().displayListRec();
}
}
Recursividad

18

19

// Devuelve el siguiente elemento de la iteracin.


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

Recursividad

20

EDA I

Lectura
De [Lewis, Chase 2006]
Captulo 10

Recursividad

21

También podría gustarte