Przerywanie zagnieżdżonych pętli
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 2 z 68.
Podczas pracy z zagnieżdżonymi pętlami zwykła instrukcja break kończy tylko najbardziej wewnętrzną pętlę. Go udostępnia jednak etykiety, które pozwalają bezpośrednio przerwać zewnętrzne pętle, dając precyzyjną kontrolę nad złożonymi strukturami pętli.
Etykieta to identyfikator, po którym następuje dwukropek, umieszczany przed pętlą. Możesz wtedy użyć break, a następnie nazwy etykiety, aby zakończyć działanie konkretnej pętli, nawet z poziomu zagnieżdżonych pętli.
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)
}
}W tym przykładzie, gdy warunek i == 1 && j == 1 jest spełniony, break outer natychmiast kończy zarówno pętlę wewnętrzną, jak i zewnętrzną. Jest to szczególnie przydatne podczas przeszukiwania dwuwymiarowych struktur danych, gdy chcesz całkowicie przerwać wyszukiwanie po znalezieniu tego, czego szukasz.
Wyzwanie
ŁatwyW tym wyzwaniu poćwiczysz używanie instrukcji break z etykietą, aby wychodzić z zagnieżdżonych pętli podczas przeszukiwania siatki 2D. Musisz znaleźć w siatce określoną liczbę docelową i natychmiast przerwać przeszukiwanie, gdy ją znajdziesz.
Otrzymasz dwa wejścia:
- Ciąg znaków reprezentujący wymiary siatki w formacie
"rows,cols"(np."3,4") - Ciąg znaków reprezentujący szukaną liczbę docelową (np.
"7")
Otrzymasz następującą siatkę liczb 2D:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Twoje zadanie:
- Przeanalizować wymiary z pierwszego wejścia, aby określić, ile wierszy i kolumn przeszukać
- Przeanalizować liczbę docelową z drugiego wejścia
- Użyć zagnieżdżonych pętli z instrukcją
breakz etykietą, aby przeszukać siatkę - Po znalezieniu liczby docelowej wypisać
"Found [target] at position ([row], [col])"i natychmiast wyjść z obu pętli za pomocą instrukcjibreakz etykietą - Jeśli zakończysz przeszukiwanie i nie znajdziesz liczby docelowej, wypisać
"Target [target] not found"
Pozycję należy podać przy użyciu indeksowania od 0 (pierwszy wiersz ma indeks 0, pierwsza kolumna ma indeks 0).
Spróbuj swoich sił
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Wczytaj dane wejściowe
var dimensions string
var targetStr string
fmt.Scanln(&dimensions)
fmt.Scanln(&targetStr)
// Przeanalizuj wymiary
dimParts := strings.Split(dimensions, ",")
rows, _ := strconv.Atoi(dimParts[0])
cols, _ := strconv.Atoi(dimParts[1])
// Przeanalizuj szukaną liczbę
target, _ := strconv.Atoi(targetStr)
// Wstępnie zdefiniowana siatka
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
// TODO: Napisz swój kod poniżej
// Użyj zagnieżdżonych pętli z etykietowaną instrukcją break, aby wyszukać szukaną liczbę
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online