ruby-nuggets 0.0.5.179 → 0.0.5.180

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/nuggets/integer/factorial.rb +28 -1
  2. metadata +1 -1
@@ -27,14 +27,30 @@
27
27
 
28
28
  class Integer
29
29
 
30
+ # Memoization container: integer => factorial(integer)
31
+ FACTORIAL = { 0 => 1 }
32
+
30
33
  # call-seq:
31
34
  # int.factorial => anInteger
32
35
  #
33
- # Calculate the factorial of +int+.
36
+ # Calculate the factorial of +int+. To use the memoized version:
37
+ # <tt>Integer.send(:alias_method, :factorial, :factorial_memoized)</tt>
34
38
  def factorial
35
39
  (1..self).inject { |f, i| f * i }
36
40
  end
37
41
 
42
+ # call-seq:
43
+ # int.factorial_memoized => anInteger
44
+ #
45
+ # Calculate the factorial of +int+ with the help of memoization (Which gives
46
+ # a considerable speedup for repeated calculations -- at the cost of memory).
47
+ #
48
+ # WARNING: Don't try to calculate the factorial this way for a too large
49
+ # integer! This might well bring your system down to its knees... ;-)
50
+ def factorial_memoized
51
+ FACTORIAL[self] ||= (1..self).inject { |f, i| FACTORIAL[i] ||= f * i }
52
+ end
53
+
38
54
  alias_method :fac, :factorial
39
55
  alias_method :f!, :factorial
40
56
 
@@ -44,4 +60,15 @@ if $0 == __FILE__
44
60
  1.upto(8) { |i|
45
61
  puts "#{i}: #{i.factorial}"
46
62
  }
63
+
64
+ require 'benchmark'
65
+
66
+ Benchmark.bm(19) { |x|
67
+ [20000, 800, 300, 700, 130, 480, 9999, 9999, 25000].each { |i|
68
+ puts "#{i}:"
69
+
70
+ x.report('factorial') { i.factorial }
71
+ x.report('factorial_memoized') { i.factorial_memoized }
72
+ }
73
+ }
47
74
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-nuggets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5.179
4
+ version: 0.0.5.180
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Wille