Uscire dai cicli annidati
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 2 di 68.
Quando lavori con cicli annidati, una normale istruzione break esce solo dal ciclo più interno. Tuttavia, Go fornisce etichette che ti permettono di uscire direttamente dai cicli esterni, offrendoti un controllo preciso sulle strutture di cicli complesse.
Un'etichetta è un identificatore seguito da due punti che si inserisce prima di un ciclo. Puoi quindi usare break seguito dal nome dell'etichetta per uscire da quel ciclo specifico, anche dall'interno di cicli annidati.
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)
}
}In questo esempio, quando la condizione i == 1 && j == 1 è soddisfatta, break outer esce immediatamente sia dal ciclo interno che da quello esterno. Questo è particolarmente utile quando si esegue una ricerca in strutture di dati 2D e si vuole interromperla del tutto non appena si trova ciò che si sta cercando.
Sfida
FacileIn questa sfida, ti eserciterai a usare istruzioni break con etichetta per uscire dai cicli annidati durante la ricerca in una griglia 2D. Devi trovare un numero specifico nella griglia e interrompere immediatamente la ricerca quando lo trovi.
Riceverai due input:
- Una stringa che rappresenta le dimensioni della griglia nel formato
"rows,cols"(ad es.,"3,4") - Una stringa che rappresenta il numero da cercare (ad es.,
"7")
Ti viene fornita la seguente griglia 2D di numeri:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Il tuo compito è:
- Analizzare le dimensioni del primo input per determinare quante righe e colonne esaminare
- Analizzare il numero obiettivo del secondo input
- Usare cicli annidati con un
breakcon etichetta per esaminare la griglia - Quando trovi il numero obiettivo, stampare
"Found [target] at position ([row], [col])"e uscire immediatamente da entrambi i cicli usando il break con etichetta - Se completi la ricerca senza trovare il numero obiettivo, stampare
"Target [target] not found"
La posizione deve essere indicata usando l'indicizzazione a partire da 0 (la prima riga è 0, la prima colonna è 0).
Provalo tu
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Leggi l'input
var dimensions string
var targetStr string
fmt.Scanln(&dimensions)
fmt.Scanln(&targetStr)
// Analizza le dimensioni
dimParts := strings.Split(dimensions, ",")
rows, _ := strconv.Atoi(dimParts[0])
cols, _ := strconv.Atoi(dimParts[1])
// Analizza il numero da cercare
target, _ := strconv.Atoi(targetStr)
// Griglia predefinita
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
// TODO: Scrivi il tuo codice qui sotto
// Usa cicli annidati con un break etichettato per cercare il numero
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online