17
UNIVERSIDAD NACIONAL AGRARIA DE LA SELVA FOR EACH Y RECURSIVIDAD INTEGRANTES: Donal Eduardo Cantaro Ayra Anthony Mitac Paucar Davis Espinoza Garay Andy Namoc Rodriguez

Taller Diapo

Embed Size (px)

Citation preview

Page 1: Taller Diapo

UNIVERSIDAD NACIONAL AGRARIA DE LA SELVA

FOR EACH Y RECURSIVIDAD

INTEGRANTES:Donal Eduardo Cantaro Ayra

Anthony Mitac Paucar Davis Espinoza Garay

Andy Namoc Rodriguez

Page 2: Taller Diapo

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 existía en otros lenguajes, facilita el recorrido de objetos existentes en una colección sin necesidad de definir el número de elementos a recorrer. La sintaxis que se emplea es:

For (TipoARecorrer nombreVariableTemporal : nombreDeLaColección ) {

Instrucciones

}

Page 3: Taller Diapo

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 más cuestiones (por ejemplo en este caso con el while, de llevar un contador, llamar en cada iteración a un método, etc.). Un for each en principio recorre todos y cada uno de los elementos de una colección. Sin embargo, podemos introducir un condicional asociado a una sentencia break; que aborte el recorrido una vez se cumpla una determinada condición.

Page 4: Taller Diapo

CARACTERISTICAS:

A partir de esta sintaxis:

1. Fíjate que en ningún 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 interpretación que podemos hacer de la sintaxis del for extendido es: “Para cada elemento del tipo TipoARecorrer que se encuentre dentro de la colección nombreDeLaColección ejecuta las instrucciones que se indican”.

for(TipoARecorrer nombreVariableTemporal : nombreDeLaColección ) {

Instrucciones

}

Page 5: Taller Diapo

4. La variable local-temporal del ciclo almacena en cada paso el objeto que se visita y sólo existe durante la ejecución del ciclo y desaparece después.

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 }}

Page 6: Taller Diapo

COMO CAMBIAR DE NOMBRE ALA VARIABLE TEMPORAL

En este tipo de ciclos podemos darle un nombre más 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 MÉTODO MAIN

Un ejemplo de llamada desde un método main (u otro lugar) sería:

System.out.println ("Mostramos todos los nombres con un ciclo for-each");lista1.listarTodosLosNombres();

Page 7: Taller Diapo

VENTAJAS Y ALGUNOS INCONVENIENTES

No se debe usar siempre. Su uso no es obligatorio, de hecho, como hemos indicado, en versiones anteriores ni siquiera existía en el lenguaje.

En vez de un for extendido podemos preferir usar un ciclo while. Lo haríamos así:

int i = 0;while (i < lista1.size() ) { System.out.println (lista1.getNombre(i) ); i++;}

Page 8: Taller Diapo

Escribe y compila el siguiente código 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

Page 9: Taller Diapo

RECURSIVIDAD

INTRODUCCIÓN:

El concepto de recursividad va ligado al de repetición. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una función, son llamados desde ella misma una y otra vez, en contraposición a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc.

Page 10: Taller Diapo

DEFINICIÓN:

Algo es recursivo si se define en términos de sí mismo (cuando para definirse hace mención a sí mismo). Para que una definición recursiva sea válida, la referencia a sí misma debe ser relativamente más sencilla que el caso considerado.

La recursividad es una técnica potente de programación que puede utilizarse en lugar de la iteración para resolver determinados tipos de problemas.

Page 11: Taller Diapo

CARACTERÍSTICAS:

1. Un método es recursivo cuando entre sus instrucciones se encuentra una llamada a sí mismo.

2. Utiliza una variable para acumular los productos y obtener la solución.

3. En la solución recursiva se realizan llamadas al propio método con valores de n cada vez más pequeños para resolver el problema.

4. Cada vez que se produce una nueva llamada al método se crean en memoria de nuevo las variables y comienza la ejecución del nuevo método.

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

Page 12: Taller Diapo

Ejemplo:

para escribir un método que calcule el factorial de un número entero no negativo, podemos hacerlo a partir de la definición de factorial:

0! = 1n!=n*(n–1)*(n–2)*...*3*2*1  si n>0

Esto dará lugar a una solución iterativa en Java mediante un bucle for:

Page 13: Taller Diapo

MÉTODO JAVA NO RECURSIVO PARA CALCULAR EL FACTORIAL DE UN NÚMERO

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;}

Page 14: Taller Diapo

Pero existe otra definición de factorial en función de sí misma:

0! = 1n! = n · (n – 1)! ,    si n > 0   (El factorial de n es n por el factorial de n-1)

Esta definición da lugar a una solución recursiva del factorial en Java:

MÉTODO JAVA RECURSIVO PARA CALCULAR EL FACTORIAL DE UN NÚMERO

public double factorial(int n){    if (n==0)        return 1;    else        return n*(factorial(n-1));}

Page 15: Taller Diapo

FACTORES:

Para medir la eficacia de un algoritmo recursivo se tienen en cuenta tres factores: Tiempo de ejecución Uso de memoria Legibilidad y facilidad de comprensión

VENTAJAS Y ALGUNOS INCONVENIENTES

Las soluciones recursivas suelen ser más lentas que las iterativas por el tiempo empleado en la gestión de las sucesivas llamadas a los métodos.

Además consumen más memoria ya que se deben guardar los contextos de ejecución de cada método que se llama.

A pesar de estos inconvenientes, en ciertos problemas, la recursividad conduce a soluciones que son mucho más fáciles de leer y comprender que su correspondiente solución iterativa.

En estos casos una mayor claridad del algoritmo puede compensar el coste en tiempo y en ocupación de memoria.

Page 16: Taller Diapo

EJEMPLO:Implementar un método 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 (); } }

Page 17: Taller Diapo

GRACIAS…..!