Salir de bucles anidados
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 2 de 68.
Al trabajar con bucles anidados, una sentencia break regular solo sale del bucle más interno. Sin embargo, Go proporciona etiquetas que le permiten salir directamente de los bucles externos, brindándole un control preciso sobre estructuras de bucle complejas.
Una etiqueta es un identificador seguido de dos puntos que se coloca antes de un bucle. Luego puedes usar break seguido del nombre de la etiqueta para salir de ese bucle específico, incluso desde dentro de bucles anidados.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break outer
}
fmt.Printf("i=%d, j=%d\n", i, j)
}
}En este ejemplo, cuando se cumple la condición i == 1 && j == 1, break outer sale inmediatamente tanto del bucle interno como del externo. Esto es especialmente útil cuando se busca a través de estructuras de datos en 2D donde se desea detener la búsqueda por completo una vez que se encuentra lo que se está buscando.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilEn este desafío, practicarás el uso de sentencias break etiquetadas para salir de bucles anidados al buscar a través de una cuadrícula 2D. Debes encontrar un número objetivo específico en la cuadrícula y detener la búsqueda inmediatamente una vez que lo encuentres.
Recibirás dos entradas:
- Una cadena que representa las dimensiones de la cuadrícula en el formato
"rows,cols"(por ejemplo,"3,4") - Una cadena que representa el número objetivo a buscar (por ejemplo,
"7")
Se te proporciona la siguiente cuadrícula 2D de números:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Tu tarea es:
- Analizar las dimensiones de la primera entrada para determinar cuántas filas y columnas buscar
- Analizar el número objetivo de la segunda entrada
- Usar bucles anidados con un
breaketiquetado para buscar a través de la cuadrícula - Cuando encuentres el número objetivo, imprime
"Found [target] at position ([row], [col])"y sal inmediatamente de ambos bucles usando el break etiquetado - Si completas la búsqueda sin encontrar el objetivo, imprime
"Target [target] not found"
La posición debe informarse utilizando una indexación basada en 0 (la primera fila es 0, la primera columna es 0).
Hoja de referencia
Las etiquetas te permiten salir de bucles externos desde el interior de bucles anidados. Una etiqueta es un identificador seguido de dos puntos colocado antes de un bucle.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if condition {
break outer // sale de ambos bucles
}
}
}Usa break seguido del nombre de la etiqueta para salir de ese bucle específico, incluso desde estructuras profundamente anidadas. Esto es útil cuando se busca a través de datos en 2D y se desea detenerse por completo una vez que se encuentra el objetivo.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Leer entrada
var dimensions string
var targetStr string
fmt.Scanln(&dimensions)
fmt.Scanln(&targetStr)
// Analizar dimensiones
dimParts := strings.Split(dimensions, ",")
rows, _ := strconv.Atoi(dimParts[0])
cols, _ := strconv.Atoi(dimParts[1])
// Analizar número objetivo
target, _ := strconv.Atoi(targetStr)
// Cuadrícula predefinida
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
// TODO: Escribe tu código a continuación
// Usa bucles anidados con una etiqueta de interrupción (labeled break) para buscar el objetivo
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos