ネストされたループからの Break
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 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 によって内側と外側の両方のループから直ちに抜けます。これは、探しているものが見つかった時点で検索全体を終了したい場合に、2次元データ構造を検索するときに特に便利です。
チャレンジ
簡単このチャレンジでは、2次元グリッドを検索する際に、ラベル付きのbreak文を使って入れ子になったループを終了する練習をします。グリッド内の特定の数値を見つけ、その数値が見つかったらすぐに検索を止めます。
次の2つの入力が与えられます。
- グリッドのサイズを
"rows,cols"形式で表す文字列(例:"3,4") - 検索する対象の数値を表す文字列(例:
"7")
次の数値の2次元グリッドが与えられています。
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}あなたのタスクは次のとおりです。
- 上のコードですでに読み込まれている値を使用します。
rowsとcols(検索するグリッドの範囲)、target、およびgridを使います。 - ラベル付きの
breakを使った入れ子のループで、グリッドを検索します。 - 対象の数値が見つかったら、
"Found [target] at position ([row], [col])"を出力し、ラベル付きのbreakを使って両方のループをすぐに終了します。 - 対象の数値が見つからずに検索が完了した場合は、
"Target [target] not found"を出力します。
位置は0から始まるインデックスで示してください(最初の行は0、最初の列は0)。
自分で試してみよう
// TODO: 以下にコードを書いてください
// ラベル付きbreakを使ったネストしたループでターゲットを探してください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ