擬似言語のwhileとforってどう違う?繰返し処理で迷子にならない方法を詳しく解説
擬似言語のコードを読んでいて、いちばん最初に出会う関門。
それが繰返し処理、whileとforです。
同じ、繰り返す、なのに書き方が2種類ある。どっちがどっちだっけ、と毎回考え込んでしまう人、いませんか?
実はこの2つ、見分け方も使い分けも、たった1つの質問で整理できます。
何回まわるか、最初からわかっているか?
この記事では、この質問を軸に、whileとforの読み方を最短ルートで解説します。細かい練習はGiji Academyの教材でできるので、ここでは迷子にならない地図を手に入れてください。
forは回数券、whileは条件つき乗り放題¶
まず、2つの違いをたとえで掴みましょう。
forは、回数券です。
10回分の回数券を持ってバスに乗るように、最初から、何回まわるか、が決まっています。
一方のwhileは、条件つきの乗り放題パスです。
雨が降っている間は乗ってよし、のように、条件を満たしている限り回り続けます。何回になるかは、走ってみないとわかりません。
| 観点 | for | while |
|---|---|---|
| たとえ | 回数券 | 条件つき乗り放題 |
| 回数 | 最初から決まっている | 条件次第で変わる |
| 得意な仕事 | 配列の全要素を順に見る | 条件を満たすまで探す・待つ |
| 事故のリスク | 少ない | 無限ループの可能性がある |
この表の最後の行が、試験的にはとても重要です。あとで詳しく触れます。
擬似言語での書き方を最小限のコードで確認¶
書き方も、それぞれ1つずつだけ見ておきましょう。
まずforです。1から5までの数を順番に足していきます。
整数型: total, i
total ← 0
for (i を 1 から 5 まで 1 ずつ増やす)
total ← total + i
endfor
forの行を日本語に訳すと、iという数え役の変数を、1から5まで、1ずつ増やしながら繰り返す、となります。
回数は5回。読む前から確定しています。
次にwhileです。xが100を超えるまで2倍にし続けます。
整数型: x
x ← 3
while (x ≦ 100)
x ← x × 2
endwhile
whileの行は、カッコの中の条件が成り立っている間は繰り返す、という意味です。
何回まわるかは、パッと見ではわかりません。3、6、12、24、48、96、192。96までは条件を満たすので、6回まわって終わります。
forは回数を読む、whileは条件を読む。視線の置き場所が違うのです。
試験でいちばん狙われるのは、境界の1回¶
whileとforの問題で、出題者が大好きな急所があります。
それは、最後の1回、まわるのか、まわらないのかという境界です。
さっきのwhileの例で言えば、xが96のとき。96 ≦ 100は成り立つので、もう1回まわって192になります。
ここを、100に近いからもう終わりだろう、と雰囲気で読むと間違えます。
forも同じです。1から5まで、は5を含みます。5未満、と勘違いして4回で数えると、答えがひとつずれます。
境界のチェック方法はシンプルで、終わり際の値を条件式に実際に代入してみること。
96 ≦ 100 → 成立、まわる。192 ≦ 100 → 不成立、終わり。この2行の確認を癖にするだけで、境界ミスはほぼ消えます。
無限ループの匂いを嗅ぎ分ける¶
whileには、forにはない事故があります。無限ループです。
条件がいつまでも成り立ち続けると、処理が永遠に終わりません。
科目Bでは、空欄補充の選択肢に、無限ループになる罠が仕込まれることがあります。
見分けるポイントは、ループの中で、条件に関わる変数が変化しているかです。
while (x < 10)
y ← y + 1
endwhile
このコード、条件のxがループ内で一切変わっていません。xが最初から10未満なら、永遠にまわり続けます。
選択肢を選ぶとき、これを入れたら条件の変数は動くか?と自問する。この1問で、罠の選択肢を消せます。
私が新人のコードレビューで必ず見る場所¶
エンジニア歴10年の私の、実体験の話です。
新人のコードをレビューするとき、私が真っ先に見るのはループの終了条件です。
なぜなら、実務のバグの多くが、ループの境界に潜んでいるからです。1回多くまわって配列の外を読んでしまう、1回足りなくて最後のデータを処理し忘れる。業界ではオフバイワンエラーと呼ばれる、古典的で、今も現役のバグです。
ベテランでもやります。私もやります。
だからプロは、境界を頭で考えず、手で確かめます。終わり際の値を代入して、成立するかしないかを確認する。さっき紹介した方法は、現場のプロが実際にやっている確認作業そのものです。
試験のテクニックではなく、一生モノの習慣として身につけてください。
読めるようになる近道は、回す様子を見ること¶
ここまでで、whileとforの読み方の地図はお渡ししました。
ただ、正直に言うと、繰返し処理は解説を読んだだけでは身につきません。
ループが1周、2周とまわるたびに変数が変わっていく。この動的な感覚は、実際に動きを目で見た人にしか宿らないからです。
擬似言語学習サイトのGiji Academyでは、擬似言語のループをブラウザ上で動かして、変数が変わっていく様子を確認しながら学べます。
回数券と乗り放題の違いを、ぜひ自分の目で確かめてください。
あわせて、変数の変化を紙で追うトレースの練習も並行すると効果が倍増します。
【関連記事】擬似言語の勉強方法とは?IT初心者でも無理なく身につく学習ステップを解説
whileとforの書き換え問題に備える¶
少し発展的な話もしておきます。
実は、forで書ける処理は、whileでも書けます。
さっきの1から5の合計は、whileならこう書けます。
整数型: total, i
total ← 0
i ← 1
while (i ≦ 5)
total ← total + i
i ← i + 1
endwhile
forが自動でやってくれていた、iの初期化と増加を、自分の手で書いた形です。
科目Bでは、この書き換えの穴埋めが出題されることがあります。forの1行に隠れていた3つの仕事、初期化、条件、増加を分解できるようにしておくと、この型の問題は得点源になります。
二重ループなど、より複雑なループの読み方に進みたい方は、こちらの記事もどうぞ。
【関連記事】擬似言語が難しいと感じる3つの原因と解決策|読めるようになる学習ステップ
ループが読めると、科目Bがスラスラ解ける!¶
最後に、モチベーションの話をひとつ。
科目Bの擬似言語問題で、ループが登場しない問題はほぼありません。
探索も、ソートも、集計も、すべてループの上に成り立っています。つまり、whileとforの読解は、科目B全体の土台です。
逆に言えば、ここを固めた瞬間、これまで呪文に見えていたコードの半分が、意味のある文章に変わります。
擬似言語が全然読めない、と感じている人ほど、実はループでつまずいているだけ、というケースは多いのです。
【関連記事】擬似言語が全くわからない!? IT初心者でも読めるようになる考え方と勉強法
まとめ:回数が決まっていればfor、条件次第ならwhile¶
whileとforの違いは、何回まわるかが最初から決まっているかどうか。
forは回数券。回数を読む。whileは条件つき乗り放題。条件を読む。
試験で狙われるのは、最後の1回がまわるかどうかの境界と、無限ループの罠。どちらも、終わり際の値を条件式に代入する確認と、条件の変数が動いているかのチェックで見抜けます。
そして、ループの感覚は動かして見た人から身につきます。
Giji Academyで、回数券と乗り放題、2つのループを実際にまわしてみてください。
科目Bの土台が、今日固まります。