Los bucles anidados permiten ejecutar una secuencia de bucles dentro de otro. Se utilizan cuando se requiere iterar sobre estructuras multidimensionales, como arreglos bidimensionales o combinaciones de elementos. El primer bucle se llama externo y el que está dentro se llama interno.
La necesidad de trabajar con estructuras anidadas, como matrices o grafos, llevó a la aparición de bucles anidados. Los lenguajes de programación, incluido Java, inicialmente admiten este mecanismo para programar tareas de procesamiento de arreglos, grafos, mallas, etc.
El uso de bucles anidados puede llevar a una alta complejidad temporal si no se considera la cantidad de iteraciones. A menudo surgen problemas de legibilidad del código y errores de indexación. Un uso incorrecto lleva a la ejecución repetida de las mismas acciones.
Ejemplo de código:
int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); }
Características clave:
¿Se puede finalizar ambos bucles de inmediato con break?
El operador break normal finaliza solo el bucle interno. Para salir de varios bucles simultáneamente, se utilizan etiquetas (label):
outer: for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (condición) break outer; } }
¿Es posible un bucle infinito debido a bucles anidados?
Sí, si la condición de salida de cualquiera de los bucles no está implementada correctamente, se producirá un bucle infinito. Esto sucede con frecuencia debido a errores en la inicialización o en el incremento del contador.
¿Se pueden modificar las variables del bucle externo desde el interno?
Sí, técnicamente es posible, pero esto reduce significativamente la legibilidad y conduce a errores. Es mejor evitarlo y separar claramente el trabajo de cada bucle.
Se implementa la iteración sobre un arreglo bidimensional, pero en lugar de i y j, se utiliza i en todas partes:
for (int i = 0; i < n; i++) { for (int i = 0; i < m; i++) {...} }
Pros:
Contras:
Se utilizan diferentes nombres de variables:
for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) {...} }
Pros:
Contras: