はじめに
プログラミングを学び始めたとき、入れ子のfor文(ネストされたループ)の動きに戸惑った経験はないだろうか?
特に、ループの中で変数がどのように変化するのかを理解することは、アルゴリズム設計の基本を学ぶ上で重要である。
この記事では、for文が複数登場するコードの動きをわかりやすく解説し、初心者が抱えがちな疑問を解決するためのヒントを提供する。
手順
1. 質問を分解して考える
以下のコード(省略形式)を見てみよう。
①for(iを2からnまで1ずつ増やす)
a←◯
②for(jを2からnまで1ずつ増やす)
if(・・・)
・・・
・・・
endif
endfor
b←◯
③for(jを2からnまで1ずつ増やす)
if(・・・)
・・・
・・・
endif
endfor
endfor
return・・・
このコードは、次のように動く。
1. iのループ(①)が最も外側にあり、その中で2つのjのループ(②と③)が実行される。
2. iが一定の値を取る間、②のjループがすべて実行される。
3. ②が終了すると、③のjループが実行される。
4. ③が終了したら、iが次の値に更新され、再び②と③の順でループが実行される。
2. 具体例で動きを追う
仮に、n=4
の場合を考えてみよう。このコードをエクセルのような表形式で考えると、以下のような流れになる。
i |
②のj の動き |
処理 | ③のj の動き |
処理 |
---|---|---|---|---|
2 | 2 → 3 → 4 | ②のループ処理を実行 | 2 → 3 → 4 | ③のループ処理を実行 |
3 | 2 → 3 → 4 | ②のループ処理を実行 | 2 → 3 → 4 | ③のループ処理を実行 |
4 | 2 → 3 → 4 | ②のループ処理を実行 | 2 → 3 → 4 | ③のループ処理を実行 |
この表を見れば、iが1つ進むたびに②と③のループがそれぞれ完全に実行されることがわかる。
3. 初心者が理解しやすい考え方
コードがどのように動いているかをイメージするためには、「エクセルの行と列」という視点が役に立つ。たとえば、次のように考えてみると直感的だ。
- iは行番号、jはその行の中で横に動く列番号のようなもの。
- 1行目(i=2)では、②のループで列全体を処理し終わった後に、さらに③のループで同じ列範囲を再処理する。
- それが終わったら、次の行(i=3)に移る。
この考え方は、ループが多重構造になっている場合にも有効である。
4. 注意すべきポイント
入れ子のループを理解する際の注意点を挙げる。
- 変数のスコープを意識する
jのループが終わるたびにjの値は初期化され、再び2から始まる。 -
処理の順序を追う習慣をつける
コード全体を上から順にトレースし、ループの動きを紙に書いてみると理解が深まる。 -
必要のないループを作らない
質問者のコードでは、②と③でループの構造が似ているように見えるが、場合によっては1つのループに統合できる可能性がある。
まとめ
入れ子のfor文は、一見複雑に見えるが、行列のような構造をイメージすると理解しやすい。
また、コードを読み解く際には、各変数の動きを丁寧に追うことが肝要である。
この記事で紹介した考え方をもとに、ぜひ自身のコードでも試してみてほしい。
入れ子のループを自在に扱えるようになれば、アルゴリズムの実装が一段と楽しくなるだろう。
コメント