再帰の打ち切り

いきなりですが,お気に入りのコードを紹介しましょう.

a(X,Y):XXXXa(sX,Y-1)

例えば,a(r,10)のように使います.単純にa(X):XXXXa(sX)と書くと
どんどん大きくなって歯止めが利きません.このように,再帰で書くと
永久に成長していってしまうパターンを,好きなサイズで止めるのが
数値引数の重要な使い方の1つです.

なお,上述のa(r,10)は,9×9の正方形状の領域全体を通って
元の位置に戻ってきます.私はこのような動きをボムと呼んでいます(笑)
正方形状の領域が多いような問題では,ボムを打ちながら
移動していくと簡単にたどりきれるようなことも多いです.
灰色マスが少ない問題では結構重宝しています.

他にも,a(X,Y):Xa(rX,Y-1)のような定義をして,
a(ss,8)などをボムのように使うといった戦略もありそうです.
9byte以下などで書ける再帰で出てくる形が点在している
問題などでは,適切なボムを作ってから挑むとよいかもしれません.


a(X,Y):XXXXa(sX,Y-1)などのコードは,ときにはボムを作る以上の
働きをしてくれます.例えばa(p,1)と書けばpを4倍してくれます.
また12歩進むには,a(sss,1)…よりもa(,3)と書くのが上手いです(計算してみてください).
勿論壁まで進むにはa(,5)とかやっておけばいいでしょう.

また,a(a(r,10)r,255)などとすると,ボムを打ちながら
歩幅が増大していき,ある意味で「十分大きな再帰」の役割を
果たしています.


厳密には「再帰の打ち切り」ではないのですが,

a(X,Y):a(sX,Y-1)XXXX

などと後ろに書くと便利なこともあります.また

a(X,Y):XXXXa(sX,Y-1)s

のように後ろに余分なものをつけることもあります.
どのような使い方があるか考えてみるとよいでしょう.

戻る inserted by FC2 system