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