From: Mauricio Fernandez Date: 2006-01-03T05:50:59+09:00 Subject: Re: Memoization, files and Marshal? On Tue, Jan 03, 2006 at 04:32:57AM +0900, Daniel Berger wrote: > > > I also applied those changes to memoize.rb 1.2.0 and generalized it to work > > > with instance methods, see the patch after memo.rb. > > Looks interesting but I get this with windows xp using his sample code: > > >ruby memoize.rb > Rehearsal ---------------------------------------------- > period 1 memoize.rb:39:in `has_key?': stack level too deep > (SystemStackError) > from memoize.rb:39:in `fib' > from memoize.rb:56:in `fib' > from memoize.rb:40:in `fib' > from memoize.rb:56:in `fib' > from memoize.rb:40:in `fib' > from memoize.rb:56:in `fib' > from memoize.rb:40:in `fib' > from memoize.rb:56:in `fib' > ... 539 levels... Your stack is too small; fib(500) goes 1000 levels deep. Change those examples to fib(100) etc.: batsman@tux-chan:/tmp$ ruby memoize.rb Rehearsal --------------------------------------------- period 1 memoize.rb:54:in `fib': let's see how deep we get (RuntimeError) from memoize.rb:39:in `fib' from memoize.rb:55:in `fib' from memoize.rb:39:in `fib' from memoize.rb:55:in `fib' from memoize.rb:39:in `fib' from memoize.rb:55:in `fib' from memoize.rb:39:in `fib' from memoize.rb:55:in `fib' ... 993 levels... from /home/batsman/usr/lib/ruby/1.8/benchmark.rb:293:in `measure' from /home/batsman/usr/lib/ruby/1.8/benchmark.rb:261:in `bmbm' from /home/batsman/usr/lib/ruby/1.8/benchmark.rb:259:in `bmbm' from memoize.rb:96 given batsman@tux-chan:/tmp$ diff -u memoize.rb.mod memoize.rb --- memoize.rb.mod 2006-01-02 21:38:18.000000000 +0100 +++ memoize.rb 2006-01-02 21:46:10.000000000 +0100 @@ -51,7 +51,7 @@ if __FILE__ == $0 def fib(n) - return n if n < 2 + raise "let's see how deep we get" if n < 2 fib(n-1) + fib(n-2) end @@ -97,10 +97,10 @@ dummy1 = Dummy1.new dummy2 = Dummy2.new bm.report("period 1") { runs.times{ fib 500 } } - bm.report("period 10"){ runs.times{ fib3 500 } } - bm.report("at_exit") { runs.times{ fib2 500 } } - bm.report("at_exit''") { runs.times{ dummy1.fib 500 } } - bm.report("at_exit'''") { runs.times{ dummy2.fib 500 }; runs = 100000} + #bm.report("period 10"){ runs.times{ fib3 500 } } + #bm.report("at_exit") { runs.times{ fib2 500 } } + #bm.report("at_exit''") { runs.times{ dummy1.fib 500 } } + #bm.report("at_exit'''") { runs.times{ dummy2.fib 500 }; runs = 100000} end end -- Mauricio Fernandez