Professional Documents
Culture Documents
Unidad 4
Lectura 4
Recuerde que para que un mtodo sea recursivo debe cumplir cuatro
condiciones bsicas y que se da la recursin cuando de forma directa o
indirecta hace una llamada a s mismo, es por ello que requiere de un corte
de control para que no quede en un bucle infinito.
Recursin
Por cada llamada a s mismo crea un nuevo hilo de ejecucin utilizando un
Un mtodo es recursivo nuevo lugar en memoria.
cuando directa o
indirectamente hace una La recursin es una herramienta muy potente de resolucin de problemas,
pero hay que saber cundo utilizarlos. Muchos algoritmos se pueden
llamada a s mismo
expresar de forma sencilla usando una formulacin recursiva, esto sucede
por ejemplo con las estructuras de datos avanzadas dinmicas rbol y grafo,
donde es necesario aplicar algoritmos recursivos en las operaciones.
Recursin Bsica
Una de las caractersticas importantes de las
estructuras de datos es la reutilizacin.
Recursin
INDUCCIN
Tcnica usada para demostrar teoremas que
cumplen los enteros positivos
return 1;
return s( n-1 ) + n;
Problemas de la Recursin
Cada llamada recursiva genera una nueva instancia en la pila
del sistema.
If ( n == 0 ) return 0;
If ( n <= 0 ) return 0;
//Rutina recursiva
public static void imprimeEnteroRec ( int n, int base) {
if ( n >= base )
imprimeEnteroRec ( n / base, base );
System.out.print( tablaDigitos.charAt(n % base));
}
//Rutina gua
public static void imprimeEntero ( int n , int base) {
/**
*/
int monedasDistintas ) {
return 1;
int monedasActuales =
minMonedas = monedasActuales;
return minMonedas;
Problema
monedasUsadas [ 0 ] = 0; ultimaMoneda [ 0 ] = 1;
int nuevaMoneda = 1;
continue;
nuevaMoneda = monedas [ j ];
Bsqueda Binaria
Concepto
else
return med;
Su cdigo es el siguiente:
import java.awt.Graphics;
private void pintaRegla (Graphics g, int izdo, int dcho, int nivel) {
if (nivel < 1)
return ;
Ejemplo:
} Dibujar un Fractal
Qu es un fractal?
Tringulo de Sierpinski
http://www.dmae.upm.es/cursofractales/capitulo1/frames.htm
(20/05/2012)
Estrella fractal
import java.awt.Graphics;
if ( b == 0 )
return a;
else
return mcd ( b, a % b );
if ( b == 0 ) {
Else {
mcdCompleto( b, a % b );
x1 = x ; y1 = y;
x = y1;
y = x1 - ( a / b ) * y1;
/**
}
mcdCompleto( a, n );
return x > 0 ? x : x + n;
5. Ordenacin
5.1 Conceptos Bsicos
La ordenacin es una aplicacin muy importante en la computacin ya que la
mayora de los datos producidos por un programa estn ordenados de alguna
manera.
Esto posibilita cmputos ms eficientes, por ejemplo la bsqueda en un vector
ordenado es ms sencilla que en uno desordenado.
Adems, una ordenacin inicial de los datos puede mejorar significativamente
un algoritmo.
Ordenacin
}
}
Caso Medio
Una inversin en un vector de nmeros es todo par (i, j ) con i < j y Ai >
Aj
Ejemplo
Se pueden calcular cotas precisas del tiempo de ejecucin del caso medio
del algoritmo de ordenacin por insercin, calculando el nmero medio
de inversiones en el vector.
5.3 Shellsort
Creado por Donald Shell, si bien no es el ms rpido conocido, mejor
de forma sustancial la ordenacin por insercin.
Comparable temp = a [ i ];
int j = i;
j -= intervalo)
a [ j ] = a [ j - intervalo ];
a [ j ] = temp ;
Consideraciones de Shellsort
Uno de los intervalos debe ser 1. En general es el ltimo
intervalo y en este caso el algoritmo es idntico a la
ordenacin por insercin.
5.4 Mergesort
Es un algoritmo divide y vencers que ofrece una mejor cota. Consta de
3 pasos:
}
}
private void mezclar( Comparable[] a, Comparable[] vtmp,
while( izq <= finIzq && der <= fin) //bucle principal
vtmp[aux++] = a[izq++];
else
vtmp[aux++] = a[der++];
vtmp[aux++] = a[izq++];
vtmp[aux++] = a[der++];
a[fin] = vtmp[fin];
5.5 Quicksort
Es el algoritmo ms rpido conocido.
/**
* Method to swap to elements in an array.
* @param a an array of objects.
* @param index1 the index of the first object.
* @param index2 the index of the second object.*/
public static void swapReferences( Object [ ] a, int index1, int index2 ) {
Object tmp = a[ index1 ];
a[ index1 ] = a[ index2 ];
a[ index2 ] = tmp;
}
// Begin partitioning
int i, j;
for( i = low, j = high - 1; ; ) {
while( a[ ++i ].lessThan( pivot ) );
while( pivot.lessThan( a[ --j ] ) );
if( i < j )
swapReferences( a, i, j );
else
break;
}
// Restore pivot
swapReferences( a, i, high - 1 );
// Restore pivot
swapReferences( a, i, high - 1 );
8 1 4 9 6 3 5 2 7 0
if(ho>lo) {
mid=x[(lo+ho)/2];
while(l<h) {
while((l<ho)&&(x[l]<mid))
++l;
while((h>lo)&&(x[h]>mid))
--h;
if(l<=h) {
t = x[l];
x[l] = x[h];
x[h] = t;
++l;
--h;
if(lo<h)
quiksort(x,lo,h);
if(l<ho)
quiksort(x,l,ho);
if(der!=izq) {
aux = numeros[der];
numeros[der]= numeros[izq];
numeros[izq]=aux;
}
}
if(izq==der){
quicksort(numeros,i,izq-1);
quicksort(numeros,izq+1,d);
}
}
else
return numeros;
return numeros;
}
Deitel y Deitel, Java cmo programar , sptima edicin, ed. Pearson, 2008.
www.uesiglo21.edu.ar