再帰関数書きたくない!!!(セグメント木編)

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のために書いたものです。このアドベントカレンダーそのものに関しては、主催者による紹介記事を見てください。

はじめに

再帰関数はとっても便利なもので、これを使うと アルゴリズムがシンプルに実装できることがありますね。 競技プログラミングでもよく使われますが、 pythonだとどうしてもこういうのを書かざるを得ません。

import sys
sys.setrecursionlimit(200000)

これ、美しさを損ねている感じがしますし、なるべくなら書きたくないですよね。 それに、たかだかスタック領域のサイズ分しか入力を扱えないというスケーラビリティの問題もあります。 なので、書かないでなんとかしましょう。

今回は、セグメント木を再帰無しで書いてみます。

セグメント木とは?

配列のある範囲内の最大・最小等をうまく求めることができるようになるデータ構造です。 偉大な先人がていねいにまとめてくださっているので、詳細はそこを見るとしましょう。例えば以下です。

algo-logic.info

やってみましょう

今回は1つのソースコードに両方まぜています。 queryが再帰なし版、query_recと__query_recが再帰版になります。

セグメント木の場合は、再帰にすると引数が多くて紛らわしいですね。。。 ボトムアップ再帰なしでやるとシンプルな感があります。 ぐぐる再帰版が出てくることが多そうな印象がありますが、これに限っては再帰なくしたほうがわかりやすくないですかね?

さいごに

このコードはある程度は動く・・・かな・・・と思う・・・