2004-06-24 [長年日記]
河馬は赤い血を流す
以前再帰関数はループに変換でき、ループにしたほうが一般的に速いと書きましたが、この際当然ながらアルゴリズム自体をループに適したものにしなければ速くなることはないでしょう。
件のソースでは二行二列まで展開した部分で、結果的に同じものを複数回計算しています*1。これを解消しようとすれば、必然的にループの形態をとることになるはずです。
行列式の計算以外でも、例えば階乗の計算やフィボナッチの計算などでは、その定義が再帰的であるが故に再帰関数として実装するととてつもなく遅いプログラムが出来上がります。これらも逆方向(数字の小さい方)から計算するなら、ループにするのが自然です。
表題は、言っていることは間違ってないんだけど、言いたいこととは微妙にずれてんじゃないの?という様子です*2。いや自戒をこめて。
おまけ
(ここにあったおまけのソースは消失してしまいました)
Pentium4 1.9GHz+Borland C++ 5.5で3.5秒前後。ただ改変する前も7秒程度で終了していた。さらに、事前メモリ確保バージョンを試したところ4.5秒程度だったので、ただ単にgccのmallocの実装がタコってるだけのような気もしてきた。
力いっぱい焚きつけろ
土間土間(居酒屋)によると大トロの刺身はtsuna sashimiなのだそうだ。で、ビントロまぐろの刺身はfatty meat tsuna sashimiらしい。昨日の二次会でメニューを見ながら、この英語表記で二人で笑っていたのだけど、そのときに隣のカップルの男の方が、女の子に「焚きつけるって言葉知ってる?」と言い出した。
曰く、「ほら焚き火とかをさ、焚きつけるって言うんだって」。この時点ではそれが転じて云々というのかと思っていたのだけど、そうではなくて元の意味を指して「知らなかった」のだそうだ。隣ではtsuna sashimiの妙味がわかる女の子がいいなどという馬鹿話をしていたのだけど、さすがに隣には勝てないなぁと思った、ただそれだけの話。
tsuna sashimiで笑っている男と、焚きつけるを知らなかった男とだったら、どっちがましでしょうか。