Выход из вложенных циклов
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 2 из 68.
При работе с вложенными циклами обычный оператор break прерывает только самый внутренний цикл. Однако Go предоставляет метки, которые позволяют выходить из внешних циклов напрямую, обеспечивая точный контроль над сложными структурами циклов.
Метка — это идентификатор, за которым следует двоеточие, который вы помещаете перед циклом. Затем вы можете использовать break, за которым следует имя метки, чтобы выйти из этого конкретного цикла, даже из вложенных циклов.
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)
}
}В этом примере, когда условие i == 1 && j == 1 выполняется, break outer немедленно завершает выполнение как внутреннего, так и внешнего циклов. Это особенно полезно при поиске в двумерных структурах данных, когда необходимо полностью прекратить поиск, как только вы найдете то, что искали.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоВ этом испытании вы попрактикуетесь в использовании именованных операторов break для выхода из вложенных циклов при поиске в двумерной сетке. Вам нужно найти определенное целевое число в сетке и немедленно прекратить поиск, как только вы его найдете.
Вы получите два входных значения:
- Строку, представляющую размеры сетки в формате
"rows,cols"(например,"3,4") - Строку, представляющую целевое число для поиска (например,
"7")
Вам предоставлена следующая двумерная сетка чисел:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Ваша задача:
- Разобрать размеры из первого входного значения, чтобы определить, сколько строк и столбцов нужно просмотреть
- Разобрать целевое число из второго входного значения
- Использовать вложенные циклы с именованным
breakдля поиска по сетке - Когда вы найдете целевое число, выведите
"Found [target] at position ([row], [col])"и немедленно выйдите из обоих циклов, используя именованный break - Если вы завершите поиск, не найдя цели, выведите
"Target [target] not found"
Позиция должна быть указана с использованием индексации, начинающейся с 0 (первая строка — 0, первый столбец — 0).
Шпаргалка
Метки позволяют выходить из внешних циклов изнутри вложенных циклов. Метка — это идентификатор, за которым следует двоеточие, помещенный перед циклом.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if condition {
break outer // выход из обоих циклов
}
}
}Используйте break, за которым следует имя метки, чтобы выйти из конкретного цикла, даже из глубоко вложенных структур. Это полезно при поиске в двумерных данных, когда вы хотите полностью остановиться, как только найдете цель.
Попробуйте сами
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Чтение входных данных
var dimensions string
var targetStr string
fmt.Scanln(&dimensions)
fmt.Scanln(&targetStr)
// Разбор размеров
dimParts := strings.Split(dimensions, ",")
rows, _ := strconv.Atoi(dimParts[0])
cols, _ := strconv.Atoi(dimParts[1])
// Разбор целевого числа
target, _ := strconv.Atoi(targetStr)
// Предопределенная сетка
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
// TODO: Напишите свой код ниже
// Используйте вложенные циклы с именованным break для поиска цели
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение