Sortir de boucles imbriquées
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 2 sur 68.
Lorsque vous travaillez avec des boucles imbriquées, une instruction break classique ne quitte que la boucle la plus interne. Cependant, Go propose des étiquettes (labels) qui vous permettent de sortir directement des boucles externes, vous offrant ainsi un contrôle précis sur les structures de boucles complexes.
Une étiquette est un identifiant suivi d'un deux-points que vous placez avant une boucle. Vous pouvez ensuite utiliser break suivi du nom de l'étiquette pour quitter cette boucle spécifique, même depuis l'intérieur de boucles imbriquées.
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)
}
}Dans cet exemple, lorsque la condition i == 1 && j == 1 est remplie, break outer quitte immédiatement les boucles interne et externe. Ceci est particulièrement utile lors de la recherche dans des structures de données en 2D où vous souhaitez arrêter complètement la recherche une fois que vous avez trouvé ce que vous cherchez.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileDans ce défi, vous allez vous entraîner à utiliser des instructions break étiquetées pour quitter des boucles imbriquées lors de la recherche dans une grille 2D. Vous devez trouver un nombre cible spécifique dans la grille et arrêter la recherche immédiatement dès que vous le trouvez.
Vous recevrez deux entrées :
- Une chaîne représentant les dimensions de la grille au format
"rows,cols"(par exemple,"3,4") - Une chaîne représentant le nombre cible à rechercher (par exemple,
"7")
Vous disposez de la grille 2D de nombres suivante :
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Votre tâche consiste à :
- Analyser les dimensions de la première entrée pour déterminer le nombre de lignes et de colonnes à parcourir
- Analyser le nombre cible de la deuxième entrée
- Utiliser des boucles imbriquées avec un
breakétiqueté pour effectuer la recherche dans la grille - Lorsque vous trouvez le nombre cible, affichez
"Found [target] at position ([row], [col])"et quittez immédiatement les deux boucles en utilisant le break étiqueté - Si vous terminez la recherche sans trouver la cible, affichez
"Target [target] not found"
La position doit être indiquée en utilisant une indexation basée sur 0 (la première ligne est 0, la première colonne est 0).
Aide-mémoire
Les étiquettes (labels) vous permettent de sortir de boucles externes à partir de boucles imbriquées. Une étiquette est un identifiant suivi d'un deux-points placé avant une boucle.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if condition {
break outer // sort des deux boucles
}
}
}Utilisez break suivi du nom de l'étiquette pour quitter cette boucle spécifique, même à partir de structures profondément imbriquées. C'est utile lors de la recherche dans des données 2D et que vous souhaitez vous arrêter complètement une fois que vous avez trouvé votre cible.
Essayez vous-même
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Lire l'entrée
var dimensions string
var targetStr string
fmt.Scanln(&dimensions)
fmt.Scanln(&targetStr)
// Analyser les dimensions
dimParts := strings.Split(dimensions, ",")
rows, _ := strconv.Atoi(dimParts[0])
cols, _ := strconv.Atoi(dimParts[1])
// Analyser le nombre cible
target, _ := strconv.Atoi(targetStr)
// Grille prédéfinie
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
// TODO: Écrivez votre code ci-dessous
// Utilisez des boucles imbriquées avec une rupture étiquetée (labeled break) pour rechercher la cible
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements