RosettaCodeData/Task/Factorial/Ruby/factorial.rb

40 lines
925 B
Ruby

# 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)
(2...n).each { |i| n *= i }
n.zero? ? 1 : n
end
# Iterative with Range#inject
def factorial_inject(n)
(1..n).inject(1){ |prod, i| prod * i }
end
# Iterative with Range#reduce, requires Ruby 1.8.7
def factorial_reduce(n)
(2..n).reduce(1, :*)
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