Тестирование метода поиска факториала числа в Ruby

Порой требуется найти факториал числа в ruby. Встроенного метода нет, поэтому добавим в класс Integer свой. Вот реализации поиска факториала найденные в сети, какой из них лучше?
После проведения теста в ruby 1.8.7 (2012-02-08 patchlevel 358) [i686-darwin12.2.0] оказалось что третий ( обозначен как inject_factorial) в ruby 1.9.2 результат примерно такой же.


require "benchmark"
class Integer
  def factorial_recursive
    self <= 1 ? 1 : self * (self - 1).factorial
  end
  def factorial_iterative
    f = 1; for i in 1..self; f *= i; end; f
  end
  def inject_factorial
    self.downto(1).inject(:*)
  end
  alias :factorial :inject_factorial
end


Benchmark.bm(70) do |x|
  x.report("factorial_recursive:")   { (1..120).each { |i| i.factorial_recursive } }
  x.report("factorial_iterative:") { (1..120).each { |i| i.factorial_iterative }}
  x.report("inject_factorial:")  { (1..120).each { |i| i.inject_factorial }}
end


Третий метод, показал себя быстрее других. inject_factorial will be better. Ruby factorial function. Testing ruby factorial function. 

Комментарии

Популярные сообщения из этого блога

Обзор набирающих популярность сайтов с ArtificialCasting.com

Be aware of "free" API when building any kind of your mash-up or start-up.