- 追加された行はこの色です。
- 削除された行はこの色です。
*場合分け(IF文) [#p142f79f]
HOJにおいて場合分けなんて出来たっけ!?っていう人も少なくないと思います.
具体例を挙げましょう.まず次のように書きます:
a(T):s
Tは数値引数です.これは,次のように解釈できます:
> Tが1以上ならばsを実行,0以下ならば何もしない.
つまり,この3bytesで既に場合分けのようなものを書いていることになります.~
数値引数が0以下ならば何もしないという取り決めが,既に場合分けそのものなのです.
----
さて,もう少し意味のありそうなものを書いてみましょう.~
例えば次のようにします:
a(T):s
b(T,X):a(10-T)Yrb(T+1,sX)
b(1,)
b(X,T):a(10-T)Xrb(sX,T+1)
b(,1)
#ref(IF_1.png,nolink)
実行してみると,平凡なうずと見せかけて少し変わっていますね. a(10-T)は
> Tが1以上9以下ならばs,そうでないならば何もしない
という意味になるためです.また,a(2-T)とすると,「T=1のときだけs」ということも
可能になります.もちろん"s"の部分に何でも入れられる
a(T,X):X
なんていうコードも便利なことがあります.
----
整数の約数, 倍数の判定に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()で両立できて縮まる!」と思ったことが~
ありましたがダメでした(笑)
----
執筆:mas