RosettaCodeData/Task/Factorial/Ruby/factorial.rb

40 lines
925 B
Ruby
Raw Permalink Normal View History

2013-04-10 21:29:02 -07:00
# Recursive
def factorial_recursive(n)
n.zero? ? 1 : n * factorial_recursive(n - 1)
end
# Tail-recursive
def factorial_tail_recursive(n, prod = 1)
n.zero? ? prod : factorial_tail_recursive(n - 1, prod * n)
end
# Iterative with Range#each
def factorial_iterative(n)
2015-11-18 06:14:39 +00:00
(2...n).each { |i| n *= i }
n.zero? ? 1 : n
2013-04-10 21:29:02 -07:00
end
# Iterative with Range#inject
def factorial_inject(n)
2016-12-05 22:15:40 +01:00
(1..n).inject(1){ |prod, i| prod * i }
2013-04-10 21:29:02 -07:00
end
# Iterative with Range#reduce, requires Ruby 1.8.7
def factorial_reduce(n)
2015-11-18 06:14:39 +00:00
(2..n).reduce(1, :*)
2013-04-10 21:29:02 -07:00
end
require 'benchmark'
n = 400
m = 10000
Benchmark.bm(16) do |b|
b.report('recursive:') {m.times {factorial_recursive(n)}}
b.report('tail recursive:') {m.times {factorial_tail_recursive(n)}}
b.report('iterative:') {m.times {factorial_iterative(n)}}
b.report('inject:') {m.times {factorial_inject(n)}}
b.report('reduce:') {m.times {factorial_reduce(n)}}
end