ネストされたループ
CoddyのGOジャーニー「基礎」セクションの一部。レッスン 49/109。
入れ子のループとは、別のループの中に配置されたループです。内側のループは、外側のループの反復ごとに最後まで実行されます。
入れ子のループを使って、1~3の数の掛け算表を作成しましょう。
rows := 3
cols := 3
for i := 1; i <= rows; i++ {
for j := 1; j <= cols; j++ {
fmt.Printf("%d×%d=%d\t", i, j, i*j)
}
fmt.Println()
}このコードを実行すると、外側のループ変数(i)の各値に、内側のループ変数(j)のすべての値を掛けたものを各行に示す九九表が得られます。出力は画面に表示されます。
1×1=1 1×2=2 1×3=3
2×1=2 2×2=4 2×3=6
3×1=3 3×2=6 3×3=9 これがどのように動作するのか、手順を追って理解しましょう。
まず、外側のループで i=1 が設定され、内側のループが最後まで実行されます。
i=1, j=1: prints "1×1=1"
i=1, j=2: prints "1×2=2"
i=1, j=3: prints "1×3=3"内側のループが終了した後、fmt.Println() で改行を出力します。
次に、外側のループで i=2 が設定され、内側のループが最初から始まり、j が再び 1 から進みます。
i=2, j=1: prints "2×1=2"
i=2, j=2: prints "2×2=4"
i=2, j=3: prints "2×3=6"最後に、外側のループで i=3 に設定され、内側のループが最後にもう一度実行されます。
i=3, j=1: prints "3×1=3"
i=3, j=2: prints "3×2=6"
i=3, j=3: prints "3×3=9"各ループにはそれぞれ独自のカウンター(i と j)があり、rows と cols は変化しません。これらはループをいつ終了するかを示すだけです。このパターンは、データの表を扱ったり、グリッド状の構造を作成したりするときにとても便利です。
チャレンジ
初心者このチャレンジでは、入れ子になったループを使って簡単なパターンを表示する練習をします。外側のループは行を反復し、内側のループは列を反復して、小さな文字のグリッドを作成します。
入れ子になったループを完成させて、アスタリスク (*) の3x3グリッドを表示してください。各アスタリスクの後にはスペースを入れるため、各行は * * * (末尾にスペースあり) のようになります。期待される出力は次のとおりです。
* * * * * * * * *
各ループにはそれぞれ新しいカウンターを使い (たとえば、行には i、1行内のアスタリスクには j)、それを rows または columns と比較してください。rows と columns 自体は変更しないでください。各行で columns 回繰り返す必要があります。
自分で試してみよう
package main
import "fmt"
func main() {
// グリッドの行数と列数
rows := 3
columns := 3
// TODO: アスタリスク (*) のグリッドを表示するためのネストしたループを作成する
// 外側のループで各行を順に処理する
// 内側のループで各列を順に処理する
for i := 0; i < rows; i++ {
// 各列にアスタリスクを表示するため、ここに内側のループを追加する
// 各行の後に改行を出力する
fmt.Println()
}
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ