class Factorial
Public Class Methods
closest(number, option = @@default[:closest])
click to toggle source
# File lib/factorial-cached/Factorial.rb, line 36 def closest(number, option = @@default[:closest]) close = (@@cache.keys.sort{ |x, y| (x - number).abs <=> (y - number).abs })[0]; return option == :value ? @@cache[close] : close; end
empty_cache( range = nil )
click to toggle source
# File lib/factorial-cached/Factorial.rb, line 15 def empty_cache( range = nil ) if range != nil then range.each{ |key| @@cache.delete(key); }; @@cache[0] = 1; else @@cache = {0 => 1}; end end
factorial(number, *options)
click to toggle source
# File lib/factorial-cached/Factorial.rb, line 72 def factorial(number, *options) return @@cache[number] if @@cache.has_key?(number); return 1 if (number = number.to_i) <= 0 || !number.is_a?(Integer); factorial = method(options.include?(:iterative) ? :iterative_factorial : options.include?(:recursive) ? :recursive_factorial : options.include?(:auto) ? (number > 100000 ? :iterative_factorial : :recursive_factorial) : @@default[:algorithm] == :recursive ? :recursive_factorial : @@default[:algorithm] == :auto ? (number > 100000 ? :iterative_factorial : recursive_factorial) : :iterative_factorial); cache = options.include?(:cache_none) ? :cache_none : options.include?(:cache_all) ? :cache_all : options.include?(:cache_one) ? :cache_one : @@default[:cache]; result = factorial.call(number, cache); @@cache[number] = result if cache != :cache_none; return result; end
get_cache()
click to toggle source
# File lib/factorial-cached/Factorial.rb, line 22 def get_cache() return @@cache; end
iterative_factorial(number, cache = @@default[:cache])
click to toggle source
# File lib/factorial-cached/Factorial.rb, line 56 def iterative_factorial(number, cache = @@default[:cache]) closest = self.closest(number, :factorial); loopThrough = closest < number ? ((closest + 1)..number) : ((number + 1)..closest); result = @@cache[closest]; for i in loopThrough do if closest < number then result *= i; else result /= i; end @@cache[i] = result if cache == :cache_all; end return result; end
recursive_factorial(number, cache = @@default[:cache], close = -1)
click to toggle source
# File lib/factorial-cached/Factorial.rb, line 41 def recursive_factorial(number, cache = @@default[:cache], close = -1) return @@cache[number] if close == number; if close == -1 then close = self.closest(number, :factorial); end result = close < number ? number * recursive_factorial(number - 1, cache, close) : recursive_factorial(number + 1, cache, close) / (number + 1); @@cache[number] = result if cache == :cache_all; return result; end
toggle(setting, default)
click to toggle source
# File lib/factorial-cached/Factorial.rb, line 26 def toggle(setting, default) if setting == :cache then @@default[:cache] = default; elsif setting == :algorithm then @@default[:algorithm] = default; elsif setting == :closest then @@default[:closest] = default; end end