同じものを繰り返すとき,次のような方法があります:
他に例えば
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倍関数を作る方が楽なことも多いです.
要は色々書いたけど,どの方法が有利かは問題ごとに多用で,
きわめて微妙な問題です.私もよく間違います.
一般論としてある程度まとめることも可能でしょうが,
問題ごとに様々な方法を取捨選択するのが良さそうですね.
複数の方法を使うことも多いです.
普段からあらゆる選択肢を視野に入れて比較検討しておくことで,
手法の取捨選択も上達すると思います.