思いついたことを

ペプシ算ファイナル - 永字八法の続き。
http://tkido.blog43.fc2.com/blog-entry-382.html
http://d.hatena.ne.jp/takanorikido/20071126
ペプシ算をRubyで解いて、さらにはそれをPerlに移植していただきました。
そこで思いついたことを二点。

Rubyの言語仕様について

関数がメソッドに取って変わられた世界と言うのは聞いてましたが、新しい関数を作るのに、デフォルトのクラス設計にメソッドを追加するとは……すごい言語だ。

class Integer
  def factorial
    (1..self).inject(1){|r, i| r * i}
  end
  def combination(n)
    self.factorial / (n.factorial * (self - n).factorial)
  end
end

これって、Integerクラスにfactorial(階乗)メソッドを追加してるんだよね?
もし、他人数でやるアプリケーション開発とかで、複数の人間が同じ名前のメソッドを定義したりしたらどうなるんだろう。それとも、名前空間か何かで区切れるんだろうか。疑問は尽きない。
それと、injectをリファレンスで確認して驚いた。同じことをPerlでやろうとしたら、

use List::Util qw ( reduce );
sub factorial {
	return reduce { $a * $b } (1..$_[0]);
}

ってやんなきゃならない。モジュールによる追加機能だっつうの。
RubyCGIが組めるフレームワーク、えーともしかして、Ruby on Rails? とか今のレン鯖に入ってたら、Ruby始めちゃうかもしんないな。

エレガントさを取るか、実用性を取るか

実際のところ、アルゴリズム的には木戸さんとこで正解なのかも知れないけど、俺が気になるのは階乗を使っているところで、しかもそれは問われる度に再計算していること。
俺がPerlでクラスを作ってごちゃごちゃやっているのは、何度も繰り返し問い合わせた際に、レスポンスを遅くしたり負荷を大きくしたりしないために、計算途中のキャッシュを保持するようにしてるから。既に計算したところは、計算せずにキャッシュから値を返すだけで済むし、まだ計算してないところも、途中から計算を始めることができて楽になるからなんだよね。
まあ、ペプシ算みたいなものを頻繁に問い合わせするようなアプリケーションってのも、あんまり思いつかないけどね。
数学的なエレガントさを取るか、(必ずしも意味があるかはわからない)実用性を取るかは、プログラマーとしての哲学の領域にまで入り込んでしまうんで、結論は出ないだろうけど。
教科書としては、基本木戸さんで、「ではこれを高速化してみましょう」みたいにできたらいいと思う。