UD4: Iteración y recursión.
Profesor: Néstor Martínez
Índice 1. 2. 3. 4. 5. 6.
Introducción. Algoritmos iterativos. La iteración. Instrucciones iterativas en Java. while Instrucciones iterativas en Java. do…while Instrucciones iterativas en Java. for Recursión.
1. Introducción. Algoritmos iterativos. ¿Adivinar varios números? ¿Validar varias fechas?... Los
lenguajes de programación cuentan con instrucciones, genéricamente denominadas iteraciones o bucles, que permiten repetir la ejecución de una instrucción un número de veces tan grande como sea preciso.
1. Introducción. Algoritmos iterativos. Iteración (pseudocódigo)
Inicio MIENTRAS condición Sentencias FIN MIENTRAS Fin
Las sentencias dentro del MIENTRAS se ejecutan repetidamente
mientras que la condición sea cierta. Si al empezar la condición es falsa las sentencias nunca son ejecutadas.
1. Introducción. Algoritmos iterativos. Actividad: Hacer el pseudocódigo para cruzar la calle, con semáforos, de una parte hasta la opuesta en diagonal. Nota: Existen básicamente 2 soluciones.
1. Introducción. Algoritmos iterativos. Otro Ejemplo: (código NO funcional, SOLO para explicar)
Programa que lee líneas (de una en una) de texto de un fichero de texto.
1. Introducción. Algoritmos iterativos. En Java, una de estas instrucciones tiene la siguiente forma: A la expresión booleana Condición se le llama guarda del
bucle, y a Instrucción se le llama cuerpo del bucle. Esta instrucción tiene el siguiente significado: Repetidamente, si Condición se evalúa a true entonces se
ejecuta Instrucción. Cuando Condición se evalúa a false, la ejecución termina. Cada vez que se ejecuta Instrucción se dice que se ha ejecutado una pasada del bucle o iteración. Abusando del lenguaje, se llama también iteración a cada una de las pasadas del bucle, distinguiéndose por el contexto si se refiere al bucle o a una de sus repeticiones.
1. Introducción. Algoritmos iterativos. Resolución ejemplo anterior: (código NO funcional, SOLO para explicar) Programa que lee líneas (de una en una) de texto de un fichero de texto.
2. La iteración. Ante
problemas indeterminadamente “largos” o “grandes” resulta imposible expresar su solución como una secuencia indeterminadamente larga de instrucciones todas diferentes. Ello significa que necesariamente debe haber algún patrón de comportamiento que se repite. Ejemplo. Se debe diseñar una función con el perfil: public
que sin usar la operación de multiplicar “*” del tipo int, calcule a · n, siendo a y n enteros no negativos.
2. La iteración. Para resolver el problema propuesto, se debe tener en
cuenta que, por definición,
que si se prefiere, se puede escribir de la siguiente
forma:
La expresión anterior pone de manifiesto que la
resolución del problema pasa por sumar ‘a’ consigo misma un número ‘n’ de veces, n > 0. Ello sugiere de inmediato el uso de una iteración.
2. La iteración. Supóngase que se declarase una variable result para
acumular el resultado de las sucesivas sumas:
2. La iteración. Ello significa que, la ejecución de las sucesivas pasadas
del bucle debe llevar a los siguientes estados:
2. La iteración. Se puede declarar una variable de tipo int local, cont, que
permita contar el número de pasadas que se van haciendo, o lo que es lo mismo, el número de veces que se lleva acumulado a en result. Nótese que, en resumen, la ejecución de todas y cada una de las pasadas conduce a un estado en el que result == cont·a. Entonces, en cada pasada, las acciones que se deben realizar son: incrementar result en a, incrementar cont en 1.
Por coherencia, antes de entrar en el bucle, se inicializará: result a 0, cont también a 0.
2. La iteración. De una manera esquemática, la iteración se puede
describir de la siguiente forma:
2. La iteración. Componentes estructurales básicas de una iteración: 1.
Guarda del bucle. Fundamentalmente, expresa que NO se ha alcanzado el estado final. En el ejemplo de la función producto (primera versión), en el estado final se debe haber sumado ‘a’ consigo misma ‘n’ veces, es decir, se debe haber llegado a ‘cont==n’. Luego la condición de repetición es ‘cont!=n’.
2. La iteración. Componentes estructurales básicas de una iteración: 2.
Cuerpo del bucle. Es la instrucción que permite avanzar pasada a pasada hacia la resolución del problema. Es aplicable desde el inicio y a todos los estados intermedios entre pasadas, que tienen suficientes características en común como para que les sea aplicable la misma instrucción. Pero alcanzado el estado final, su aplicación ya no tiene sentido. En el ejemplo de producto, al incrementar repetidamente result en a, se consiguen productos parciales cada vez mayores. Llegado el punto en que cont==n, en result se tiene el resultado deseado. Seguir incrementando en a el valor de esta variable haría que se perdiera el resultado correcto.
2. La iteración. Componentes estructurales básicas de una iteración: 3.
Inicialización de las variables. Previamente a la entrada en el bucle, se inicializan adecuadamente las variables para ajustarlas a la estructuración iterativa del problema. Después de la inicialización, se debe poder empezar a aplicar las instrucciones del cuerpo. En el ejemplo de la función producto, result debe estar definida, más exactamente inicializada a 0, para poder empezar a acumular valores en esta variable. Nótese además, que si el valor del parámetro n es 0, no se necesita realizar ninguna pasada del bucle. La inicialización de result y de cont producen directamente el resultado final.
2. La iteración. Terminación del bucle. Una característica esencial de las soluciones algorítmicas es su
ejecución en un tiempo finito. La instrucción de iteración, por su propia estructura es susceptible de errores que precisamente conducen a ejecuciones infinitas. CUIDADO con los bucles infinitos, que son aquellos que NO terminan NUNCA (la guarda del bucle siempre es cierta). En el caso de producirse un bucle infinito, el programa se seguirá ejecutando y se quedará “colgado” hasta que el usuario mate el proceso. Ejemplo:
2. La iteración. Terminación del bucle. Para comprobar su terminación, el método consiste en definir
alguna cantidad asociada al bucle que dé una medida de su progreso hacia el estado final. Esta medida, cuyo valor dependerá de las variables del bucle, se denomina función limitadora. Deberá ser: entera, acotada superiormente (por definición no podrá tomar un
valor mayor que uno fijado), su valor aumentará (acotada superiormente) en cada pasada del bucle. Se acercará a un valor que hará que termine el bucle. También se puede dar los dos casos comentados anteriormente pero a la inversa (acotada inferiormente y su valor disminuirá en cada pasada del bucle).
Todo bucle que termina tiene una función limitadora que
lo demuestra, aunque encontrarla NO siempre es fácil.
3. Instrucciones iterativas en Java. while... Estructura destinada a iterar un bloque de código. Un bloque puede ser una sola sentencia o un conjunto de
código delimitado por llaves ( { } ). El bucle while se utiliza cuando se tiene que ejecutar un grupo de sentencias un número determinado de veces (cero o más veces).
3. Instrucciones iterativas en Java. while... ď‚— Sintaxis:
3. Instrucciones iterativas en Java. while... La estructura del while se puede dividir en tres grandes
componentes La palabra reservada while. La condición expresada entre paréntesis, mientras sea
verdadera se repetirá el bloque especificado. El bloque de código a repetir.
3. Instrucciones iterativas en Java. while... ď‚— Ejemplo:
Cuerpo
InicializaciĂłn
Guarda
3. Instrucciones iterativas en Java. while... Ejemplo:
Mientras no se ingrese el numero cero, la condición es
verdadera y repetirá el bloque de código.
3. Instrucciones iterativas en Java. while... A tener en cuenta: La condición va entre paréntesis. La línea del while no lleva punto y coma. El while se termina cuando la condición se hace falsa. Si la condición es falsa de entrada, nunca se ejecutará el código dentro del while.
3. Instrucciones iterativas en Java. while... Contadores y acumuladores. ď‚— Los contadores al igual que los acumuladores son
variables a las cuales se las trata de manera particular. ď‚— Se les denomina contador a aquellas variables que son incrementadas o decrementadas con un valor constante para todas las iteraciones. ď‚— Sin embargo, a aquellas que son modificadas con valores diversos se les denomina acumuladores.
3. Instrucciones iterativas en Java. while... Contadores y acumuladores.
contador++; es lo mismo que poner contador=contador+1; contador--; es lo mismo que poner contador=contador-1; acumu+=valor es lo mismo que poner acumu=acum+valor; acumu-=valor es lo mismo que poner acumu=acumuavalor;
3. Instrucciones iterativas en Java. while... Consideraciones… Visto lo anterior ahora viene lo siguiente: while(contador++>7) ó if(contador++>7)
Esto lo que hace es, comprueba primero el valor de contador, mira si es mayor que 7, y luego independientemente de que se cumpla dicha condición actualiza el valor de contador a contador+1, pero ese nuevo valor lo comprobará en la siguiente vez que vuelva a esa línea de código (en el caso del bucle, en la siguiente iteración).
while(++contador>7) ó if(++contador>7) Esto lo que hace es, primero actualiza el valor de contador a contador+1 y en ese mismo momento comprueba el valor de contador, mira si es mayor que 7. Si se cumple dicha condición entra en el cuerpo del while o del if, dependiendo en qué caso estemos.
3. Instrucciones iterativas en Java. while... ď‚— Ejercicio: Hacer un programa que muestre todos los
nĂşmeros del 1 al 10.
3. Instrucciones iterativas en Java. while...
Solución ejercicio: Hacer un programa que muestre todos
los números del 1 al 10.
3. Instrucciones iterativas en Java. while...
Solución ejercicio: Hacer un programa que muestre todos
los números del 1 al 10.
3. Instrucciones iterativas en Java. while... ď‚— Ejercicio: Crear un programa que solicite nĂşmeros
hasta que se ingrese un 0 y retorne la suma de los mismos.
3. Instrucciones iterativas en Java. while... Solución: Pseudocódigo:
3. Instrucciones iterativas en Java. while... Solución: (continuación) Posible solución:
3. Instrucciones iterativas en Java. while... Ejercicio: Modificar el ejercicio anterior para que
también, a parte de sumar los números insertados hasta que se introduzca un cero, muestre por pantalla la cantidad de números ingresados.
3. Instrucciones iterativas en Java. while...
Solución ejercicio: Modificar el ejercicio anterior para que
despliegue también la cantidad de números ingresados.
3. Instrucciones iterativas en Java. while... Más ejercicios… Ejercicio 1: Modificar el programa anterior para que muestre los números múltiplos de 3, del 1 al 100. Ejercicio 2: Modificar el programa anterior para que comenzando en 1000 decremente el valor del mismo en 0,25 hasta alcanzar el numero 900. Ejercicio 3: Crear un programa en java que solicite
una palabra y un número, para luego desplegar la palabra tantas veces como indique el número.
3. Instrucciones iterativas en Java. while...
Solución ejercicio 3: Crear un programa en java que solicite
una palabra y un número, para luego desplegar la palabra tantas veces como indique el número.
3. Instrucciones iterativas en Java. while... ď‚— Ejercicio: Implementa en Java el algoritmo de realizar
el producto de dos nĂşmeros mediante sumas, sin usar el producto.
3. Instrucciones iterativas en Java. while... Solución: Una ligera variante del bucle anterior utilizaría
la variable cont para contar el numero de veces que quedan por sumar a a result, de forma que a lo largo de las sucesivas pasadas, cont fuese tomando los valores n, n − 1, . . . , 0:
3. Instrucciones iterativas en Java. while... ď‚— SoluciĂłn: Otra variante:
3. Instrucciones iterativas en Java. while... Ejercicio: Realiza un programa que realice la división de
dos números enteros mediante restas. Crea una función para ello con la sintaxis: static int division (int a, int b)
3. Instrucciones iterativas en Java. while... Solución:
3. Instrucciones iterativas en Java. while... Solución: (continuación)
3. Instrucciones iterativas en Java. while... Solución: (continuación)
3. Instrucciones iterativas en Java. while... Solución: (continuación)
3. Instrucciones iterativas en Java. while... while(true) Hace que el bucle siempre se repita indefinidamente. Se sale del mismo con break. Sirve, por ejemplo, para obligar al usuario a ingresar un dato correctamente. En este caso da lo mismo usar while ó do..while (vemos a continuación).
3. Instrucciones iterativas en Java. while... while(true) Ejemplo:
Ingresar una fecha del siglo XX o XXI y verificar si es correcta. Puedes seguir esta estructura:
Un año es bisiesto si es divisible entre 4, excepto si es divisible entre 100 pero no entre 400.
4. Instrucciones iterativas en Java. do…while… Es muy similar a la estructura while, sus diferencias
radican en que la estructura do…while evalúa la condición al final del bloque a ejecutar. Esto garantiza que el bloque de código será ejecutado al menos una vez.
4. Instrucciones iterativas en Java. do…while…
4. Instrucciones iterativas en Java. do…while…
4. Instrucciones iterativas en Java. do…while… Ejemplo:
4. Instrucciones iterativas en Java. do…while… Ejemplo: do{ System.out.println("ingrese un numero (0 para salir)"); a=input.nextInt(); }while(a!=0);
NOTA: De esta manera evito inicializar la variable ‘a’ a algún valor válido para que entre por primera vez en el bucle while por ejemplo.
4. Instrucciones iterativas en Java. do…while… Ejemplo:
¿Y qué pasa si el fichero está vacío?
4. Instrucciones iterativas en Java. do…while… Ejemplo: Solución ficheros vacíos. Saltaría una excepción de leer una línea que no existe (fichero vacío). Por ello antes comprobamos que realmente hay líneas de texto que leer mediante una condición. No se puede mostrar la imagen en este momento.
4. Instrucciones iterativas en Java. do…while… Ejercicio: Escribir un programa que nos pregunte si
queremos acabar el programa. Acabará cuando le pongamos la cadena de texto "si". Hacerlo tanto con while como con do…while.
4. Instrucciones iterativas en Java. do…while… Solución con while:
Para este ejemplo haría falta la librería nsIO, como no disponemos de ella, usa la clase Scanner.
1 vez ) 2 veces, repito el mismo código!
4. Instrucciones iterativas en Java. do…while… Solución con do…while:
1 vez sólo!
4. Instrucciones iterativas en Java. do…while… Solución con do…while:
Si en vez de ‘&&’ pusiéramos ‘||’, ¿qué pasaría?
4. Instrucciones iterativas en Java. do…while… Haciendo menús: Es una estructura de repetición con opciones. De las opciones posibles sólo se puede elegir una. Termina con una opción destinada para Generalmente la opción ‘0’ (cero).
ello.
La mejor forma de confeccionar un menú en Java
para la consola o terminal, es mediante la instrucción do…while
4. Instrucciones iterativas en Java. do…while… Haciendo menús:
(continuación)
4. Instrucciones iterativas en Java. do…while… Haciendo menús: (continuación) La mejor forma de confeccionar un menú en Java para la consola o terminal, es mediante la instrucción do…while
Actividad: Haz un menú para que muestre las
operaciones que se pueden realizar en una calculadora. Codificarlo en Java y probarlo.
4. Instrucciones iterativas en Java. do…while… Haciendo menús: Entrada de datos correcta. También se puede tratar de manera muy efectiva la comprobación de la entrada correcta de datos. Esto se realiza mediante una combinación de la
instrucción do…while y tratamiento de excepciones (try…catch). Además, aunque se puede hacer de muchas otras formas pero se recomienda ésta, hay que incluir una variable booleana para controlar si se ha producido algún error en la entrada de datos (y volver a pedir datos) o no.
4. Instrucciones iterativas en Java. do…while… Haciendo menús: Entrada de datos correcta. Actividad: Realiza un menú para la calculadora que ya tienes hecha, con una opción de salir y además trata de manera adecuada los datos de entrada. Si nos pusiera por ejemplo letras en vez de números enteros, lo cual provocaría una excepción, informad al usuario y volver a pedir datos. Haced lo mismo si pone una opción que no tenemos contemplada, informad al usuario y volver a pedir datos.
5. Instrucciones iterativas en Java. for… Al igual que el “while” o “do…while”, el “for” es una
estructura destinada a iterar un bloque de código.
En particular la estructura for está especialmente
diseñada para la iteración en las que conocemos la cantidad de veces que se repetirá el código.
5. Instrucciones iterativas en Java. for… La sintaxis del for podemos subdividirlo en 3 partes: Inicialización. (optativo) Guarda del bucle o condición. (optativo) Avance en el bucle o incremento. (optativo) Sintaxis en Java: for(inicialización; condición; incremento){ sentencia; //ó varias sentencias. }
5. Instrucciones iterativas en Java. for… Explicación de la sintaxis del for: for(inicialización; condición; de/incremento){ sentencia; //o conjunto de sentencias }
La expresión inicial o inicialización se ejecuta antes de entrar en
el bucle. Si la condición es cierta, se ejecuta sentencia y después la expresión final o incremento/decremento. Luego se vuelve a evaluar la condición, y así se ejecuta la/s sentencia/s una y otra vez hasta que la condición sea falsa.
5. Instrucciones iterativas en Java. for‌
5. Instrucciones iterativas en Java. for… El bucle for se utiliza cuando se necesita ejecutar una
serie de sentencias un número fijo y conocido de veces.
5. Instrucciones iterativas en Java. for… Pasos: 1. Se realiza la inicialización. 2. Se evalúa la expresión booleana. 3. Si la expresión booleana es cierta, realiza las sentencias del cuerpo del bucle. Si la expresión booleana NO es cierta se acaba el bucle, es decir, pasa al paso 6. 4. Realiza el incremento/decremento. 5. Vuelve al paso 2. 6. FIN.
5. Instrucciones iterativas en Java. for… Contadores. Una de sus mayores utilidades es usarlo para contar ya que en una línea se resuelve todo el contador. Observe la equivalencia for/while:
Como ves…. Ahorramos líneas de código! (para ciertos
casos)
5. Instrucciones iterativas en Java. for… Ejemplo 1:
5. Instrucciones iterativas en Java. for… Ejemplo 2:
Pregunta: ¿Qué números muestran estos ejemplos?
5. Instrucciones iterativas en Java. for… NOTA: Las tres expresiones del bucle for se
pueden omitir, con el siguiente resultado.
NO es una buena práctica omitir elementos del for,
por lo tanto hay que tener cuidado que su estructura esté completa.
5. Instrucciones iterativas en Java. for… Simplificación de operadores:
5. Instrucciones iterativas en Java. for… Ejercicio 1: Mostrar los números del 0 al 200 de 5 en 5
usando la estructura for. simplificado.
Usa algún operador
5. Instrucciones iterativas en Java. for… Ejercicio 2: Hacer un conteo, de 10 a 0 de 0.5 en 0.5.
Usa algún operador simplificado.
5. Instrucciones iterativas en Java. for… Ejercicio 3: ¿Éste código qué hace?
Haz una traza en la pizarra para n=5.
5. Instrucciones iterativas en Java. for… Ejercicio 4: Suma los n primeros números usando la
estructura for.
5. Instrucciones iterativas en Java. for… Solución Ejercicio 4: Sumar los n primeros números.
5. Instrucciones iterativas en Java. for… Ejercicio 5: Hacer un programa para generar tablas de
multiplicar. Se debe solicitar el número de la tabla y luego generarla.
Ejercicio 6: Amplía el ejercicio anterior. Pedirás
números al usuario y mostrarás para cada uno de ellos su tabla de multiplicar hasta que el usuario nos introduzca un número negativo, entonces finalizará el programa.
5. Instrucciones iterativas en Java. for… Ejemplo Sucesiones:
5. Instrucciones iterativas en Java. for… Ejemplo Sucesiones:
5. Instrucciones iterativas en Java. for… Ejemplo Sucesiones:
5. Instrucciones iterativas en Java. for… Ejemplo Sucesiones:
5. Instrucciones iterativas en Java. for… Ejemplo Sucesiones: Aún se podía haber hecho más sencillo, sabiendo que suma contendrá el valor del término anterior, antes de actualizarse al nuevo término: int suma=7; for(int i=2;i<=n;i++){ suma+=2; }
5. Instrucciones iterativas en Java. for… Bucles anidados (continuación) Es cuando tenemos un bucle dentro de otro, ya sea un for
dentro de un while, un while dentro de un for, un do while dentro de un for, etcétera.
5. Instrucciones iterativas en Java. for… for anidado Cuando un for contiene otro for dentro se dice que están
anidados. El primer for repite n veces al otro for.
Ejemplo de un producto cartesiano (explico qué es en la
siguiente transparencia):
5. Instrucciones iterativas en Java. for… for anidado (continuación)
En matemáticas, el producto cartesiano de dos conjuntos es una operación que resulta en otro conjunto cuyos elementos son todos los pares ordenados que pueden formarse tomando el primer elemento del par del primer conjunto, y el segundo elemento del segundo conjunto. Por ejemplo, dados los conjuntos A = {1, 2, 3, 4} y B = {a, b}, su producto cartesiano es:
5. Instrucciones iterativas en Java. for… for anidado (continuación) Solución del ejemplo de un producto cartesiano (explico
qué es en la siguiente transparencia):
6. Recursiรณn.
6. Recursión.
Ó también caso base: if(y==0) return 1;
6. Recursiรณn.
6. Recursiรณn.
6. Recursión. Conclusión: Toda solución recursiva puede ser presentada de manera iterativa. Las soluciones iterativas equivalentes son mucho más óptimas que las recursivas (por las operaciones de reserva de stack o pila en cada una de las llamadas recursivas). Sólo vale la pena quedarse con la recursiva cuando: No tienes tiempo/ganas de pensar la iterativa (que generalmente requiere más cabeza). b) El código está pensado para ser leído/discutido por gente con perfil matemático. a)