for文の二重ループを一重ループにする方法

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

一重ループという言葉が正しいのかどうかはともかく、for文の二重ループをfor文一つだけにする方法についてメモとしてJavaScriptのコードで書きます。

プログラマのためのコードパズル ~JavaScriptで挑むコードゴルフとアルゴリズムを呼んで知った方法。といっても、方法は単純なので、やり方を知った今となってはなぜ今まで思いつかなかったんだろうとさえ思う。

2次元配列を探索する場合、たいていの場合は二重ループを使うことが多いと思います。例えば、九九を一の段から順番に探索していって、初めて50以上になった掛け算のみ出力するというプログラムを書こうと思った場合、二重ループを使うと下記のようになります(もっと実用性のあるプログラムを思いつけばよかったのですが、思いつきませんでした・・・。後、見つからなかった場合の判定もしていません)。

このように二重ループで書いた場合、全く同じbreak文の判定条件文を2回書かなければいけません。しかし、これを一重ループにすることにより、breakの判定条件文を1回だけですますことができます。例えば下記のような感じ。

for文の継続条件はiについて書いているのにたいし、for文の中のカウンタ変数の更新はjのみについて書いています。そうして、iについてはj+1が9未満にならない(つまり9以上)になる時にカウントするようにし、その時jは次のループで0になるように-1に変更します。これでループ一つだけで、2次元配列を探索し、breakの条件判定文も一つだけですむようになりました。

一見、何をしてるのか分かりにくいんですけどね。ただたんにbreakの判定条件を一つだけにしたいなら、関数化するほうが分かりやすいかもしれません。

2016/10/16追記:
二重ループを抜けるのには、ラベル構文というものを使ったほうがいいかもしれません(JavaScriptで多重ループを抜けるラベル構文について | while(isプログラマ))。

コメントを残す

メールアドレスが公開されることはありません。