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.
Desafío
FácilEn este desafío, practicarás el uso de instrucciones break etiquetadas para salir de bucles anidados al buscar en una cuadrícula 2D. Debes encontrar un número objetivo específico en la cuadrícula y detener la búsqueda inmediatamente en cuanto lo encuentres.
Recibirás dos entradas:
- Una cadena que representa las dimensiones de la cuadrícula con el formato
"rows,cols"(por ejemplo,"3,4") - Una cadena que representa el número objetivo que se debe 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 en la cuadrícula - Cuando encuentres el número objetivo, imprimir
"Found [target] at position ([row], [col])"y salir inmediatamente de ambos bucles usando el break etiquetado - Si completas la búsqueda sin encontrar el objetivo, imprimir
"Target [target] not found"
La posición debe indicarse usando índices basados en 0 (la primera fila es 0 y la primera columna es 0).
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 comportamientosPractica por tu cuenta: Compilador de Go online