40 lines
925 B
Ruby
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
|