Está en la página 1de 17

FOR EACH

INDRODUCCION: En las ltimas versiones de Java se introdujo una nueva forma de uso del for, a la que se denomina for extendido o for each. Esta forma de uso del for, que ya exista en otros lenguajes, facilita el recorrido de objetos existentes en una coleccin sin necesidad de definir el nmero de elementos a recorrer. La sintaxis que se emplea es: For (TipoARecorrer nombreVariableTemporal : nombreDeLaColeccin ) { Instrucciones }

DEFINICION: es una herramienta muy til cuando tenemos que realizar recorridos completos de colecciones, por lo que lo usaremos en numerosas ocasiones antes que ciclos for o while que nos obligan a estar pendientes de ms cuestiones (por ejemplo en este caso con el while, de llevar un contador, llamar en cada iteracin a un mtodo, etc.). Un for each en principio recorre todos y cada uno de los elementos de una coleccin. Sin embargo, podemos introducir un condicional asociado a una sentencia break; que aborte el recorrido una vez se cumpla una determinada condicin.

CARACTERISTICAS: A partir de esta sintaxis: for(TipoARecorrer nombreVariableTemporal : nombreDeLaColeccin ) { Instrucciones } 1. Fjate que en ningn momento se usa la palabra clave each que se usa en otros lenguajes, aunque al for muchas veces se le nombre como for each. 2. Para saber si un for es un for extendido o un for normal hemos de fijarnos en la sintaxis que se emplea. 3. La interpretacin que podemos hacer de la sintaxis del for extendido es: Para cada elemento del tipo TipoARecorrer que se encuentre dentro de la coleccin nombreDeLaColeccin ejecuta las instrucciones que se indican.

4. La variable local-temporal del ciclo almacena en cada paso el objeto que se visita y slo existe durante la ejecucin del ciclo y desaparece despus. 5. Debe ser del mismo tipo que los elementos a recorrer.

Ejemplo: public void listarTodosLosNombres () { for (String i: listaDeNombres) { System.out.println (i); //Muestra cada uno de los nombres dentro de listaDeNombres } }

COMO CAMBIAR DE NOMBRE ALA VARIABLE TEMPORAL En este tipo de ciclos podemos darle un nombre ms descriptivo a la variable temporal, por ejemplo: public void listarTodosLosNombres () { for (String i: listaDeNombres) { System.out.println (i); //Muestra cada uno de los nombres dentro de listaDeNombres } } COMO LLAMAR AL MTODO MAIN Un ejemplo de llamada desde un mtodo main (u otro lugar) sera: System.out.println ("Mostramos todos los nombres con un ciclo lista1.listarTodosLosNombres(); for-each");

VENTAJAS Y ALGUNOS INCONVENIENTES No se debe usar siempre. Su uso no es obligatorio, de hecho, como hemos indicado, en versiones anteriores ni siquiera exista en el lenguaje. En vez de un for extendido podemos preferir usar un ciclo while. Lo haramos as: int i = 0; while (i < lista1.size() ) { System.out.println (lista1.getNombre(i) ); i++; }

Escribe y compila el siguiente cdigo ejemplo de uso de un for extendido: public class TestForExtendido { public static void main (String [] Args) { ArrayList <String> jugadoresDeBaloncesto = new ArrayList<String> (); jugadoresDeBaloncesto.add ("Michael Jordan"); jugadoresDeBaloncesto.add ("Kobe Briant"); jugadoresDeBaloncesto.add ("Pau Gasol"); jugadoresDeBaloncesto.add ("Drazen Petrovic"); int i = 0; System.out.println ("Los jugadores de baloncesto en la lista son: "); for (String nombre : jugadoresDeBaloncesto) { System.out.println ((i+1) + ".- " +nombre); i++; } } //Cierre del main } //Cierre de la clase

RECURSIVIDAD
INTRODUCCIN: El concepto de recursividad va ligado al de repeticin. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una funcin, son llamados desde ella misma una y otra vez, en contraposicin a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc.

DEFINICIN: Algo es recursivo si se define en trminos de s mismo (cuando para definirse hace mencin a s mismo). Para que una definicin recursiva sea vlida, la referencia a s misma debe ser relativamente ms sencilla que el caso considerado. La recursividad es una tcnica potente de programacin que puede utilizarse en lugar de la iteracin para resolver determinados tipos de problemas.

CARACTERSTICAS: 1. Un mtodo es recursivo cuando entre sus instrucciones se encuentra una llamada a s mismo. 2. Utiliza una variable para acumular los productos y obtener la solucin. 3. En la solucin recursiva se realizan llamadas al propio mtodo con valores de n cada vez ms pequeos para resolver el problema. 4. Cada vez que se produce una nueva llamada al mtodo se crean en memoria de nuevo las variables y comienza la ejecucin del nuevo mtodo.

5. Para entender el funcionamiento de la recursividad, podemos pensar que cada llamada supone hacerlo a un mtodo diferente, copia del original, que se ejecuta y devuelve el resultado a quien lo llam.

Ejemplo: para escribir un mtodo que calcule el factorial de un nmero entero no negativo, podemos hacerlo a partir de la definicin de factorial:

0! = 1 n!=n*(n1)*(n2)*...*3*2*1 si n>0
Esto dar lugar a una solucin iterativa en Java mediante un bucle for:

MTODO JAVA NO RECURSIVO PARA CALCULAR EL FACTORIAL DE UN NMERO

public double factorial(int n){ double fact=1; int i; if (n==0) fact=1; else for(i=1;i<=n;i++) fact=fact*i; return fact; }

Pero existe otra definicin de factorial en funcin de s misma: 0! = 1 n! = n (n 1)! ,

si n > 0 (El factorial de n es n por el factorial de n-1)

Esta definicin da lugar a una solucin recursiva del factorial en Java: MTODO JAVA RECURSIVO PARA CALCULAR EL FACTORIAL DE UN NMERO public double factorial(int n){ if (n==0) return 1; else return n*(factorial(n-1)); }

FACTORES: Para medir la eficacia de un algoritmo recursivo se tienen en cuenta tres factores: Tiempo de ejecucin Uso de memoria Legibilidad y facilidad de comprensin VENTAJAS Y ALGUNOS INCONVENIENTES

Las soluciones recursivas suelen ser ms lentas que las iterativas por el tiempo empleado en la gestin de las sucesivas llamadas a los mtodos. Adems consumen ms memoria ya que se deben guardar los contextos de ejecucin de cada mtodo que se llama. A pesar de estos inconvenientes, en ciertos problemas, la recursividad conduce a soluciones que son mucho ms fciles de leer y comprender que su correspondiente solucin iterativa. En estos casos una mayor claridad del algoritmo puede compensar el coste en tiempo y en ocupacin de memoria.

EJEMPLO: Implementar un mtodo recursivo para ordenar los elementos de un vector: class Recursivdad { static int [] vec = {312, 614, 88, 22, 54}; void ordenar (int [] v, int cant) { if (cant > 1) { for (int f = 0 ; f < cant - 1 ; f++) if (v [f] > v [f + 1]) { int aux = v [f]; v [f] = v [f + 1]; v [f + 1] = aux; } ordenar (v, cant - 1); } } void imprimir () { for (int f = 0 ; f < vec.length ; f++) System.out.print (vec [f] + " "); System.out.println("\n"); } public static void main (String [] ar) { Recursivdad r = new Recursivdad(); r.imprimir (); r.ordenar (vec, vec.length); r.imprimir (); } }

También podría gustarte