*場合分け(IF文) [#p142f79f]
HOJにおいて場合分けなんて出来たっけ!?っていう人も少なくないと思います.
具体例を挙げましょう.まず次のように書きます:

 a(T):s

Tは数値引数です.これは,次のように解釈できます:

> Tが1以上ならばsを実行,0以下ならば何もしない. 

つまり,この3bytesで既に場合分けのようなものを書いていることになります.~
数値引数が0以下ならば何もしないという取り決めが,既に場合分けそのものなのです.

----

さて,もう少し意味のありそうなものを書いてみましょう.~
例えば次のようにします:

 a(T):s
 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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS