繰り返しの方法

同じものを繰り返すとき,次のような方法があります:

例えば"slsr"を5倍するときは, などが考えられるというわけです.
大まかな有利不利はありますが,全て一長一短あるので,
色んな可能性を念頭におくようにしましょう.


n倍関数の利用

例えば3倍関数

t(X):XXX

を定義しておくと,
9倍や27倍(後者は,「とにかく壁にぶつかるまでやる」みたいなときでしょうか)
なども作ることができます.例えば

t(X):XXX
t(t(t(s))sr)

などと使えそうです.

他に例えば

w(X):XX
t(X):XXX

という定義をすると2倍,3倍が自由にできるようになりますが,
しかし実はこの定義をした瞬間に既に1byteの損が確定しています.
2倍関数と3倍関数を両方必要とする場合は,
w(X,Y):XXXYYという関数を定義すれば十分です(上記より1byte少ない).
つまり,3倍したいときはw(●,)とし,2倍したいときはw(,●)とすればよいのです
2倍,3倍以外の使い方の場面でも使える可能性があるので, 場合によってはw(X,Y):XYYXXなどの関数が有効なときもあるかもしれません.

5倍関数が3倍関数で代用できる場合があります.
これは「4回で戻ってきて,さらに1回進む」というタイプのときです.
例えばt(X):XXXとして,t(t(sr))を実行してみてください.


数値引数の利用

4つめの項目は,a(X,Y):Xa(X,Y-1)とするとY倍関数が定義できるというものです.
3倍したいもの,4倍したいもの,5倍したいものなどが入り混じっている場合や,
一気に11倍を作りたいときなどに有効そうです.


どの方法が有利?

まず増やしたいものが1種類のときは,数値引数が有利なことは少ないです.
ただ「何かを10倍し方向転換,それをさらに7倍」のように,色んな倍率で
増幅させる場合には数値引数が有利なことが多いです.
しかし2倍, 3倍,8倍,9倍などを多用する場合には
文字で置いたりn倍関数を作る方が短く書けることが多いです.

たくさん増やさなければいけない場合,再帰で書けるなら再帰が
有利なことが多いですが,再帰は初期位置合わせが面倒だったり,
実行部分に繰り返しが多いとn倍関数を作る方が楽なことも多いです.

要は色々書いたけど,どの方法が有利かは問題ごとに多用で,
きわめて微妙な問題です.私もよく間違います.
一般論としてある程度まとめることも可能でしょうが,
問題ごとに様々な方法を取捨選択するのが良さそうですね.
複数の方法を使うことも多いです.
普段からあらゆる選択肢を視野に入れて比較検討しておくことで,
手法の取捨選択も上達すると思います.


戻る inserted by FC2 system