妹と再帰
「再帰とか考えたやつ死ねばいいのに」
我が妹が唐突にそんなことを言い出した。
「どした? 親でも殺されたみたいに」
未来は苦虫をかみつぶしたように言った。
「再帰とか分かんないの……やたら計算量だけはかかるわ実装は面倒だわ、そのくせメリットわかんないし、昔は再帰が無い言語があったってね……いい時代だったね」
ちなみに再帰とは関数が自身を呼び出すことだ。
有名どころだとフィボナッチ数列を求める
fib(int n){
if((n == 1) && (n == 0)){
return 1;
}else{
return fib(n-1) + fib(n-2);
}
このへんである。
fib(3)を呼ぶとfib(2)がfib(1)を呼び出してといった感じで計算が進んでいく。
何がめんどくさいってちょっと間違うと無限ループに入ったり、方法が正しくてもちょっと大きな数を渡すと現実的な時間で終わらなかったりする。
例に出したコードではfib(40)でもうすでに平均的な計算機でははっきり分かるくらいの町が生じる。
現代のコンピュータの計算の速さからすると待ちが生じるだけでヤバい量の計算をしているのは分かると思う。
決して三次元ムービーをレンダリングしているわけではない、やっているのはたかだか165580141を求めるだけだ。
「アレはアレで便利なんだぞ、再帰死ねとか言っていたら敬虔なLISPerにボコられかねないので気をつけろ」
「だってたかだかソートだよ! 普通に挿入ソートの何が悪いんだかわかんない!」
「挿入ソートはなあ……ちょっとデータが増えると終わんないぞ」
「いいじゃないですか! 一回きりのソートですよ、ユーザだって待ってくれますよ」
ん? 一回きり?
「なあ、サーチは何回するんだ?」
「一回だけですよ、勉強のために書いてるだけですし」
「なぁ、言いにくいんだけどさ……」
「なんですか?」
「サーチしないんならソートの必要なくないか? ソートは定数時間以下にならないから検索が一回なら頭から順にたぐっても変わんないぞ」
「えぇ……そうなんですか!?」
「勉強のためなら書いてもいいけど、実用に耐えるかはさておき完成を目指せばいいんじゃないか?」
時には妥協も大事だぞ。
「うん! ありがとね、お兄ちゃん!」
そう言うと未来は自分のMacBookを引き寄せてコードを書き出した、この調子なら一時間もあれば終わるだろう。
昔はこだわってたよな……などと自分のことを思い出しながら熱心な妹に感心して、あのことの自分の心はどこに……などと考えるのだった。




