forの七変化
3つの部分は省略できる
for が1種類しかないのに困らないのは、3つの部分をそれぞれ省略できるからです。省略すると、他の言語のループそっくりの形になります。
条件だけ残すと while になる
Go
for stock > 0 {
stock--
}初期化と後処理を消して条件だけ残した形です。他の言語の while (stock > 0) と同じ動きになります。セミコロンも要りません。
Go に while という単語が無いのは、この形で足りるからです。
全部消すと無限ループになる
Go
for {
// ずっと続く
}条件が無いので、自分で止めない限り終わりません。止めるには break を使います。
Go
count := 0
for {
count++
if count >= 3 {
break
}
}「回数は決まっていないが、ある条件が来たら抜けたい」ときの形です。入力を受け付け続けるサーバーや、条件が満たされるまで再試行する処理でよく出てきます。
break と continue
プレーンテキスト
break ループを抜ける
continue 今回の残りを飛ばして、次の周へ進むcontinue は、条件に合わないものを飛ばすときに使います。
Go
for i := 0; i < len(prices); i++ {
if prices[i] == 0 {
continue // 0円は数えない
}
total += prices[i]
}if で囲んでも同じことは書けますが、除外したい条件を先に書いて弾くほうが、本筋の処理が右に寄らずに済みます。条件が増えるほど差が出ます。
無限ループの注意
for {} の中で break を書き忘れると、プログラムは止まりません。このコースの採点は30秒で打ち切られるので、タイムアウトとして落ちます。
プレーンテキスト
Execution timed out (30 seconds limit)この表示が出たら、まず無限ループを疑ってください。条件が一度も真にならない、あるいは変数が変化していない、のどちらかであることがほとんどです。
要件
N人に配ってM個余りますの形を返す- 条件だけを残した
forで、引き算を繰り返して求める - 配布数が0以下のときは
配布数が不正ですを返す - 在庫が配布数に満たないときは
0人に配ってN個余りますを返す
入出力例
distribute(10, 3) → "3人に配って1個余ります"
distribute(9, 3) → "3人に配って0個余ります"
distribute(2, 3) → "0人に配って2個余ります"
distribute(10, 0) → "配布数が不正です"
distribute(10, -1) → "配布数が不正です"ヒント
編集 ゆめさく編集部