http://jijixi.azito.com/cgi-bin/diary/index.rb?date=20060711#p02
経由で、
http://ll.jus.or.jp/2006/blog/doukaku2
class Collatz
include Enumerable
def initialize( n )
@n=n
@cache={1=>1}
end
def calc(n)
@cache[n]=_calc(n) unless @cache.include?(n)
@cache[n]
end
def _calc(n)
return 1+calc( 0==n%2 ? n/2 : n*3+1 )
end
def each
(1..@n).each{ |n| yield [n,calc(n)] }
end
end
p Collatz.new(100).max{ |a,b| a[1]<=>b[1] }[0]書いてみた。
初めて Enumerable なクラスを作ったような気がする。ruby はよく書くんだが、オブジェクト指向方面の機能をほとんど使ってないなぁと改めて思う。
無駄に長いような気がしてならない(最初にアップしたときと比べると数行短くなっているが)。
_calc を calc の中に書くと短くなるか。うーむ。
キャッシュは、n について計算しているときに n/2 未満を捨てるというコードを入れるとメモリ使用量が減ると思う。そうは書いてないが。
スタックオーバーフローがちょっとこわいが、出題が N=100 だし、どんまいということで。
速くなる工夫とか軽くなる工夫とか、そんなのは全然してない。偶数ぐらいとばした方が良かったか。あ。一応キャッシュはしてる。