二重ループのフローチャートはどう書く?動かしてわかる実行順序と繰り返し回数

二重ループのフローチャートは、内側の繰り返しを外側の繰り返しの中に置いて表します。大切なのは、内側が終わったあとに外側を1つ進め、次の内側を最初から始めることです。
「矢印はどこへ戻す?」「3回の中で4回繰り返すと、合計7回? 12回?」。この記事では、3行4列のマスを順に塗る例で、その疑問を確かめます。外側・内側の値とフローチャートを一緒に追い、回数を変えたときの結果も予想してみましょう。
二重ループとは? 3回と4回を「足す」のではなく「入れ子にする」
たとえば、3つの棚にそれぞれ4個の商品を並べる作業を考えます。1段目に4個並べてから2段目へ移り、また4個並べ、最後に3段目にも4個並べます。1個並べる処理は合計12回です。
外側のループが棚の段を選び、内側のループがその段の商品を1個ずつ処理します。このように、繰り返しの中に別の繰り返しを置くことを、入れ子、またはネストと呼びます。
対して、「3回の処理を終えてから、別の処理を4回行う」なら二重ループではありません。繰り返しを2つ順番に並べただけなので、両方の処理回数の合計は7回です。
フローチャートは、内側と外側の戻り先を分ける
今回の図では、開始・終了を角の丸い記号、値の初期化や更新を長方形、条件判定をひし形で表します。判定から出る矢印には「はい」「いいえ」を付け、どちらへ進むかを区別します。
外側のカウンタをi、内側のカウンタをjとします。ここでのiとjは、それぞれ行と列を表す番号で、どちらも0から数えます。画面の「塗った回数」は、判定や更新ではなく、「マスを塗る」という処理を実行した回数です。
- iと塗った回数を0にする。
- 外側の条件「iが行数未満か」を判断する。「いいえ」なら終了する。
- 「はい」ならjを0に戻す。ここが新しい行の始まりになる。
- 内側の条件「jが列数未満か」を判断する。
- 「はい」ならマス(i, j)を塗り、jを1増やして内側の判定へ戻る。
- 内側が「いいえ」になったらiを1増やし、外側の判定へ戻る。
jを増やしたあとは内側の判定へ戻り、jの初期化へは戻りません。iを増やしたあとは外側の判定へ戻ります。その判定が「はい」だったときにだけ、jを0へ戻して次の行を処理します。
動かして確認:外側3回、内側4回なら何回塗る?
まず合計回数を予想して回答し、「1ステップ」で流れを追ってみてください。色の付いた枠は直前に実行した処理、色の付いた矢印は次の進行方向です。マス内には処理した順番が表示されます。
とくに、jが4になる場面と、次の行でjが0になる場面を比べると、二重ループの区切りが分かります。「自動再生」は途中で一時停止できます。行数・列数を変えると実行は最初に戻ります。
条件と予想
まだ回答していません。
練習する条件
現在の条件の解答・解説
実行履歴
実行順序を追う:内側が一巡してから外側が進む
3行4列の場合、マスを塗るときの(i, j)は次の順番です。
- 1行目:(0, 0)→(0, 1)→(0, 2)→(0, 3)
- 2行目:(1, 0)→(1, 1)→(1, 2)→(1, 3)
- 3行目:(2, 0)→(2, 1)→(2, 2)→(2, 3)
1行目ではiは0のままで、jだけが0、1、2、3と変わります。最後のマスを塗ったあとjを4にすると、「4 < 4」は成り立たず、内側のループを抜けます。次にiを1に増やし、外側の判定が「はい」ならjを0へ戻します。
iとjを同時に増やすのではありません。同時に増やすと(0, 0)、(1, 1)、(2, 2)のように斜めのマスだけをたどる別の処理になってしまいます。
なぜ内側のカウンタを毎回0に戻すのか
1行目の処理が終わったとき、jは4です。2行目に移ってもそのままにすると、最初から「4 < 4」が「いいえ」になり、2行目を1マスも塗れません。3行目も同じです。
そのため、jの初期化は外側のループの中、内側のループの手前に置きます。一方、iの初期化は外側のループに入る前に一度だけ行います。外側の戻り先をiの初期化にしてしまうと、iが毎回0になり、終了に近づきません。
処理回数と、終了したときのカウンタは違う
この例では、塗る処理の回数は3 × 4 = 12回です。しかし、最後に塗ったマスは(2, 3)で、終了時の値はi = 3、j = 4です。最後に塗ったあとも更新と判定があるため、終了時の値は最後のマスの番号と一致しません。
条件判定も塗る回数とは別です。外側の判定は、3行を始める判定と最後に終了する判定で4回。内側は各行で4回の「はい」と最後の「いいえ」があるため、5回ずつ、合計15回判定します。
「外側の回数 × 内側の回数」で塗る回数を求められるのは、各行で同じ列数を処理し、途中で打ち切らない今回のルールだからです。内側の回数が行ごとに変わったり、途中で繰り返しを抜けたりする場合は、そのまま掛け算にはできません。
練習問題:回数を変えたらどうなる?
教材の「練習する条件」で同じ設定を選べます。予想を入力してから実行し、回数だけでなく終了時の値も確かめてください。
1問目:3行4列
塗る処理は全部で何回ですか。最後に塗るマスの(i, j)はいくつですか。
解答・解説
12回です。最後に塗るマスは(2, 3)。その後の更新と判定を経て、i = 3、j = 4で終了します。
2問目:2行3列
塗る処理は全部で何回ですか。1行目の終わりから2行目の始まりまで、jはどう変わりますか。
解答・解説
6回です。1行目の最後のマスは(0, 2)で、塗ったあとjは3になります。内側を抜け、iを1にして外側の判定を通ると、jが0へ戻ります。次に塗るマスは(1, 0)です。
3問目:0行4列
内側が4回でも、外側が0回なら塗る処理は実行されますか。
解答・解説
0回です。最初の外側の条件「0 < 0」が「いいえ」なので、jの初期化にも内側の判定にも進みません。画面のjは「—」のままです。これは0ではなく、まだ値を設定していないことを表します。
4問目:3行0列
塗る処理が0回でも、iは増えますか。前問と流れの違いを考えてみましょう。
解答・解説
塗る処理は0回ですが、iは0から3まで増えます。各行でjを0に戻した直後に「0 < 0」が「いいえ」になり、そのたびにiを1増やすためです。終了時はi = 3、j = 0になります。
二重ループを使う場面と、処理量への注意
表の全セルを確認する、座席を行と列で調べる、複数のサイズと色の組み合わせを列挙する、といった「それぞれについて、さらにすべてを処理する」場面で二重ループが役立ちます。
ただし、繰り返しを重ねるほど処理量が増える点には注意が必要です。100行100列なら1万回、1,000行1,000列なら100万回です。両方を10倍にすると回数は100倍になります。すべての組み合わせが必要なのか、探したいものが見つかったら終了できるのかなど、目的に合わせて手順を考えます。
まとめ:戻り先と初期化の位置を確認する
二重ループは、外側を1回進めるごとに、内側を最初から繰り返す構造です。フローチャートでは、内側の更新は内側の判定へ、内側の終了は外側の更新へつなぎます。内側のカウンタを初期化する位置と、2本の戻り経路を確認すると、複雑に見える流れも順に追えます。
基本の矢印を確認するならフローチャートのループの書き方、ひし形とループ端記号を比較するならループ端記号・前判定・後判定の使い分け、回数や終了時の値を練習するなら動かして確かめる繰り返しの練習問題も参考になります。