二重のfor文

教科書 P.135から, 「二重のfor文」という項がある. ここはとても重要なので, この教材でも説明しておく.

ひとつの変数について, ある範囲の値をすべてとらせるためには, for文を使って繰り返せばよいことを前回学んだ. たとえば, i を0から10まで変えながら何かの処理を行うには,

for(i=0; i<=10; i++){ 何かの処理; }
とすればよいのだった. こうすると,
iが0 iが1 … iが10
の順に処理が行われる.
ところが, 二つの変数について, 「それぞれある範囲の値をすべてとらせる」ことを考えてみよう. たとえばiは0から10まで, jは0から5まで, すべての組み合わせをとらせたいとする. 一度にまとめて計算するわけには行かないから, 繰り返しを使って順に試すことになるが, その順序をどうするか. まずiの値をひとつ決めておき, それに対してjを0から5まで変化させる. jが一巡したら, iの値をひとつ増やして, jをもう一巡させる. ものごとの順序はこうなる:
iが0, jが0 --- まずiを0に固定して計算開始 iが0, jが1 --- jを増やす iが0, jが2 … iが0, jが5 --- jが一巡したので, iを増やすときがきた iが1, jが0 --- jはまた0に戻って次の一巡を始める iが1, jが1 iが1, jが2 … iが10, jが4 iが10, jが5
これを行うプログラムが二重ループで,
for(i=0; i<=10; i++){ for(j=0; j<=5; j++){ 何かの処理; } }
となる. 外側のループがiをひとつ固定し, 内側のループがそのiに対してjを一巡させているわけだ.
教科書のList 6-4 (P.136)は, さらにもうひとひねりしてあって, 内側のjの値の範囲が0からiまでとなっている. この場合jの上限は, (その時点で固定されている)外側のiまでとなる. さっきのようにものごとの順序を考えてみよう.

まず, i が0に固定される. で, 内側のjのループが始まる. jの初期値も0だが, ループの継続条件「j<i」は この時点で既に成立していない. したがって,内側のループは一度も繰り返すことなく終了して, 次のiの値にすすむことになる. 以下, こうなる:

iが1, jが0 --- iが1になってjのループ開始するが一回でおわり iが2, jが0 --- iが2にふえて, jのループ開始 iが2, jが1 --- jが一巡した iが3, jが0 --- iが3にふえて, jのループ開始 iが3, jが1 iが3, jが2 --- jが一巡した iが4, jが0 --- iが4にふえて, jのループ開始 iが4, jが1 iが4, jが2 … iが9, jが7 iが9, jが8 --- jが一巡した, さらにiもループ終了
List 6-4がこのような順序で動くことを理解してもらいたい.
[page 4] prev index next