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