*場合分け(IF文) [#p142f79f] HOJにおいて場合分けなんて出来たっけ!?っていう人も少なくないと思います. 具体例を挙げましょう.まず次のように書きます: a(X):s Xは数値引数です.これは,次のように解釈できます: > Xが1以上ならばsを実行,0以下ならば何もしない. つまり,この3bytesで既に場合分けのようなものを書いていることになります.~ 数値引数が0以下ならば何もしないという取り決めが,既に場合分けそのものなのです. ---- さて,もう少し意味のありそうなものを書いてみましょう.~ 例えば次のようにします: a(X):s b(X,Y):a(10-X)Yrb(X+1,sY) b(1,) 実行してみると,平凡なうずと見せかけて少し変わっていますね. a(10-X)は > Xが1以上9以下ならばs,そうでないならば何もしない という意味になるためです.また,a(2-X)とすると,「X=1のときだけs」ということも 可能になります.もちろん"s"の部分に何でも入れられる a(X,Y):Y なんていうコードも便利なことがあります. ---- 整数の約数, 倍数の判定にIF文を利用することも可能です. 例えば a(X,T):X b(A,B,X):a(X,2-A)b(A-B,B,X) という関数を作成すると, b(A,B,X)は, > A-1がBの倍数のときに限りXを実行する という関数になります. 一部の問題では必須の考え方になるでしょう. ---- Herbertは,数値引数に頼るとbytes数が膨らみやすいです. 特に,場合分けは多くのbytes数を必要とします. 大半の問題では,場合分けなしに乗り切る方法を考えた方がよいでしょう. なお,「目の前が壁なら…,そうでないなら…」のような場合分けは恐らくできません. ---- 最後に細かい注意です.次の4bytesコードを実行しようとするとエラーになります. a(X):s s a(X)を定義して使っていません.「定義したものを使っていない」という理由で~ 動作しないことはないのですが,この場合はXが数値引数を表すのか,命令引数を~ 表すのか判断できないため,エラーとなるようです.~ 以前どこかで,「a(数値)とa()で両立できて縮まる!」と思ったことが~ ありましたがダメでした(笑)