Column
分岐の学び方

プログラミングを始めた人が、おそらく初めに出会う制御文が分岐だと思います。
難しい反復でつまずかないためにも、まずは「分岐」で条件の書き方に慣れておきたいところです。
分岐は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)を配列の添字に使用することで、分岐と同じ効果を得ることができました。 「ルックアップテーブル」と呼ばれるテクニックです。 分岐や反復などの制御文は、複雑な使い方ができることも重要ですが、 最終到達地点として「使わずに同じ事を実現する」を意識することで、更なるレベルアップに繋がるかもしれません。