初めに
どうも!
...お久しぶりですね。
記事を書くのをサボっていたわけじゃぁないですよ、この日のためにアイディアを貯めて...
...ウソですハイ。
さて、こういうつまらん話はおいておいて...
たまーにデータパックの解説とか見てると...
「再帰」とか聞いたりしません?
プログラムとかやってないと、聞きなじみがないかもしれませんが...
僕も最初は「んだそれ、知らねぇぞそんなの。」となりましたし...
っということで、今日は、そういう「再帰」についてのお話です。
本題
再帰っていうのはですね、関数内で同じ関数を呼び出すことです。
どーいう時に使われてんの?というと。
例えば...壁にぶつかるまで一瞬でテレポート! とか。
単純なTPを使って視線の100ブロック先までTP!とかしたとき、移動先にブロックがあったら自分が埋まりますよね。
丁度良く埋まらないようにTPするのにこの「再帰」は超使えるわけです。
どうやってやるのかというと...
#> namespace:tp
# 目の前に何かあったらその場所にTP
execute unless block ^ ^ ^1 air run tp @s ~ ~ ~
# 目の前に何もなかったら実行位置をずらして再帰
execute if block ^ ^ ^1 air positioned ^ ^ ^1 run function namespace:tp
こういう感じになります。
上は、視線の1ブロック先にairが無かったらそこにtpするというもの。
airじゃないものは大体ブロックですよね、ブロックがあったらその一個前にTPできるわけです。まぁ、このままじゃ全然動かないんですけど...
下は視線の1ブロック先にairあったら位置を視線の1ブロック先にして再帰です。
こうすることでなんと、実行位置を変えながら同じ処理を行えます。
再帰に条件をつけることで、条件に一致しなくなったら止まる...ということですね。
...確かにTick処理で自分の位置をちょっとずつずらしながら目の前にブロックがあったら止まる、目の前にブロックが無かったらちょっと動く...みたいのをすれば同じところに到達できるかもしれませんが、何よりそれは1tickたってもう1tick...さらに次のtick... と時間がかかるわけです。「再帰」なら一瞬でこんなテレポートができるわけですからね。
終わりに
どうでしょうか、「再帰」面白いでしょう?
...正味言って、今回あげた説明用のコード、「forでいいじゃん!」と思いますが。
もちろん! mcfunctionにはforなんてものはないので。
forのような動作ができるのもmcfunctionの再帰のいいところです。
参考にしたヤツ