分岐の学び方
難しい反復でつまずかないためにも、まずは「分岐」で条件の書き方に慣れておきたいところです。
分岐はif,else,else if,switchなど、沢山のパターンがあるように見えますが、まずは「if」だけを使って分岐を練習してもよいと思います。
それを続けていくと、自然と「もっとスマートな書き方ができるのでは?」と感じるはずです。
例えば次のようなパターンを見てみましょう。
例:変数valueの値が10よりも大きいときはA、それ以外はBと表示。
ifだけで実現すると、以下のようになります。
(C言語で記述しています)
if( value > 10 )
{
printf("A\n");
}
if( value <= 10 )
{
printf("B\n");
}
確かに正しく分岐できますが、わざわざ反対の条件を考えるのは冗長な気もします。
そこで「else」を使うことにより、
if( value > 10 )
{
printf("A\n");
}
else
{
printf("B\n");
}
このように「条件が正しくない場合の処理」を簡潔に記述することができました。
分岐以外にも言えることですが、プログラムの組み立て方は沢山あります。
あまり「こういう時は〇〇でなければならない!」と思い込まずに、自由に発想してもよいと思います。
「ifだけでもできるけど、複雑な条件だと他のパターンで書いた方が読みやすい」ぐらい、気楽に考えてみましょう。
しかし、私は分岐のゴールとして「いかに分岐を無くすか?」を目指したいと考えています。
分岐はプログラムの中でも、比較的重たい(時間のかかる)処理です。
最近のPCは高性能なので、体感することは少ないかもしれませんが、PCにとって負担になることは確かです。
反復処理で数万回の分岐を行えば、目に見えてプログラムの動作速度が低下する恐れもあります。
また、いくら「else if」などで分岐を連結できたとしても、大量に分岐の羅列があれば可読性を損ない、
バグの原因にもなるでしょう。
分岐という処理は、理解すればするほど「どうやれば使わずに済むか?」が重要に思えてきます。
以下は、よく使われる分岐の削減テクニックです。
例:数値に応じて、特定の文字を表示する。
int value = 3;
if( value == 0 )
{
printf("A\n");
}else if( value == 1 ){
printf("B\n");
}else if( value == 2 ){
printf("C\n");
}else if( value == 3 ){
printf("X\n");
}else if( value == 4 ){
printf("Y\n");
}else if( value == 5 ){
printf("Z\n");
}
変数valueの値に応じて、対応するA,B,C,X,Y,Zの文字を表示しています。
switchで分岐させることも可能ですが、いずれにせよ沢山の分岐が必要です。
これを配列を活用して、分岐そのものを無くしてみます。
char characters[] = {'A','B','C','X','Y','Z'};
int value = 3;
printf("%c\n" , characters[value]);
数値(value)を配列の添字に使用することで、分岐と同じ効果を得ることができました。
「ルックアップテーブル」と呼ばれるテクニックです。
分岐や反復などの制御文は、複雑な使い方ができることも重要ですが、
最終到達地点として「使わずに同じ事を実現する」を意識することで、更なるレベルアップに繋がるかもしれません。