• Alternatively, if you only need to memoize ONE function you can do:

    class Memoizer
      def factorial(n)
        with_cache(n) do |n|
          puts "calling factorial(#{n})"
          n == 0 ? 1 : n * factorial(n - 1)
        end
      end
      def with_cache(*args, &blk)
        (@_cache ||= Hash.new { |memo, keys| memo[keys] = blk.call(*keys) })[args]
      end
    end
    # m = Memoizer.new
    # irb(main):012> m=Memoizer.new
    # => #<Memoizer:0x00007ff826151b40>
    # irb(main):013> p m.factorial(3)
    # calling factorial(3)
    # calling factorial(2)
    # calling factorial(1)
    # calling factorial(0)
    # 6
    # => 6
    # irb(main):014> p m.factorial(4)
    # calling factorial(4)
    # 24
    # => 24
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment