Você está na página 1de 23

RECURSIVIDAD

Estructura de Datos
Ing. De Sistemas
Marco A. Adarme Jaimes
madarme@ufps.edu.co

Marco A. Adarme J.

Marco A. Adarme J.

Recursividad
En forma muy simple, un problema es
recursivo, si su solucin pasa por
autoejecutarse (con otros parmetros).

En el cuerpo de sentencias del


mtodo se invoca el mismo es
una versin ms pequea del
problema original.

Marco A. Adarme J.

Marco A. Adarme J.

Recursividad...Ejemplo
Contar a un grupo de
personas...
Solucin NO recursiva...
Los ponemos en fila, y
partiendo del primero,
contamos
secuencialmente
1, 2, 3, 4, 5, 6, ...., n

Solucin recursiva.
Si no hay nadie, entonces
hay 0, sino hay uno +
contar al resto
1 + contar(n-1)

Marco A. Adarme J.

Reglas para la recursividad


Conocer el caso trivial (fin de la
recursividad)
Si no hay nadie, entonces hay cero

Definir la recursividad
sino, hay uno + contar al resto

+
Marco A. Adarme J.

TCNICA

Marco A. Adarme J.

Ejemplo Factorial (x)

Marco A. Adarme J.

Marco A. Adarme J.

Ejemplo prctico en JavaOrden de llamado directo


public static int contardigitos(int valor){
if (valor < 10)
return 1;
return (1 + contardigitos(valor/10));
}

Por ejemplo:
public static void main(String args[]) {
int digitos=contardigitos(321);
System.out.println(digitos); // Imprime 3
}
Marco A. Adarme J.

Ejemplo prctico en Java


Orden de llamado direct

int contardigitos(321)
1. Llamada Recursiva
public static int contardigitos(321){
if (321 < 10)
return 1;
return (1 + contardigitos(32));
return(1+
}
2. Llamada Recursiva
public static int contardigitos(32){
if (32 < 10)
return 1;
return (1 + contardigitos(3));
}

Devuelve a donde fu
llamado (3)

2)

Devuelve 2

return(1+1)

Devuelve 1
2. Llamada Recursiva
Public static int contardigitos(3){
if (3 < 10)
return 1; Se sale y se devuelve donde fue llamado
return (1 + contardigitos(??));
}

Marco A. Adarme J.

FUNCIONALIDAD
Invocacin del subalgoritmo a s mismo.
Cada llamada al subalgoritmo se realiza con un
valor de parmetro que hace el problema de menor
tamao.
La llamada al subalgoritmo se realiza siempre en
una sentencia de seleccin.
En dicha sentencia de seleccin, al menos debe de
haber un caso donde se acta de forma diferente
(no recursiva). Este es llamado caso base.
Ocultacin de los detalles de gestin de la memoria
en las llamadas recursivas(Pila Interna)

Marco A. Adarme J.

Ejemplo prctico en JavaOrden de llamado indirecto

Imprimir en Binario el valor de un


Nmero
Los nmeros binarios slo usan 0 y 1 para
representar sus valores.
Ejemplos:
22: 10110
(1*24+1*22 + 1*21 )= 16+4+2= 22

Un posible algoritmo sera:


Si el numero es 0 o 1 su valor en binario es conocido,
es si mismo
Sino, es la representacin binaria de la mitad del
numero, seguido de un 0 o un 1 si es el numero es par o
impar respectivamente

Marco A. Adarme J.

Ejemplo prctico en JavaOrden de llamado indirecto


public String enBinario(int x){
if (x ==0) return 0;
if (x ==1) return 1;
if (n%2 = =0) // es par
return (enBinario(x/2)+0);
if (n%2 = =1) // es impar
return (enBinario(x/2)+1);
}

Marco A. Adarme J.

Ejemplo prctico en JavaOrden de llamado indirecto


public String enBinario(int x){
if (x ==0) return 0;
if (x ==1) return 1;
if (n%2 = =0) // es par
return (enBinario(x/2)+0);
if (n%2 = =1) // es impar
return (enBinario(x/2)+1);
}

x==1
2%20
0)
5%21
1)
11%21
+ 1)
22%20
+ 0)

System.out.println( enBinario(22))

r (1)

r (enBinario(2/2 =1) +
r (enBinario(5/2 =2) +
r (enBinario(11/2 =5)
r (enBinario(22/2 =11)
Marco A. Adarme J.

1
r(1+0)
r(1+0 +
1)
r(1+0 + 1
+ 1)
r(1+0 + 1 +
1 + 0)

10110

Ejemplo prctico en Javallamado indirecto vs Indirecto


L=<1,2,3,4,5>
public String toString1 (Nodo<T> otraCab) {
if (otraCab==null)
return ();
return(otraCab.getInfo().toString()
+toString1(otraCab.getSig());
}

public String toString2 (Nodo<T> otraCab) {


if (otraCab==null)
return ();
return(toString2(otraCab.getSig()
+otraCab.getInfo().toString());
}

L.toString1()
1,2,3,4,5

L.toString2()
5,4,3,2,1

Mtodos Decoradores
Recursin en Estructuras de datos

public class ListaS<T> implements Iterable<T> {

public String toString1 ( )


{ Nodo<T> otroCab=
this.cab;
public String toString1
return( this.toString1(otro
(Nodo<T> otraCab)
Cab) ;

Marco A. Adarme J.

No existe caso
base

Marco A. Adarme J.

Ejemplo: Buscar un dato en un


Array(int)
public static boolean esta(int x, int []v, int indice)
{
if(indice==v.length)
return false;
Caso Base
if(v[indice]==x)
return true;
return(esta(x,v,++indice));
}
Caso General: Buscar en el resto del Array

Marco A. Adarme J.

Ejemplo: Buscar un dato en un


Array(int)
Si int v[]={3,6,8,10} y se busca el 8
Invocacin:
esta(8, v, 0) esta(x=8,v, indice=0)

v[0]!=8esta(8,v,1)
v[1]!=8esta(8,v,2)
v[2]==8return(true)

Marco A. Adarme J.

Ejemplo: Buscar un dato en un


Array(int)Algoritmo Errado

public static boolean esta(int x, int []v, int indice)


{
if(indice==v.length)
return false;
if(v[indice]==x)
return true;
return(esta(x,v,indice++));
}

Cul es el error?
Marco A. Adarme J.

Ejemplo: Buscar un dato en un


Array(int)Algoritmo Errado

La postCondicin hace que el indice siempre valga


0, generando llamadas recursivas infinitas

Marco A. Adarme J.

Você também pode gostar