場合分け(IF文)

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)
IF_1.png

実行してみると,平凡なうずと見せかけて少し変わっていますね. 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


添付ファイル: fileIF_1.png 338件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-01-16 (水) 23:01:47 (4123d)