Python:
from functools import lru_cache, reduce
from operator import mul
from datetime import datetime
def factorial_recursive(n):
"""Basic recursive implementation."""
if n == 0:
return 1
return n * factorial_recursive(n - 1)
def factorial_iterative(n):
"""Iterative implementation - most efficient for large numbers."""
result = 1
for i in range(1, n + 1):
result *= i
return result
@lru_cache(maxsize=None)
def factorial_cached(n):
"""Cached recursive implementation - efficient for repeated calculations."""
if n == 0:
return 1
return n * factorial_cached(n - 1)
def factorial_reduce(n):
"""Functional approach using reduce."""
return reduce(mul, range(1, n + 1), 1)
def benchmark(n=20, iterations=1000):
"""Benchmark different implementations."""
implementations = {
'Recursive': factorial_recursive,
'Iterative': factorial_iterative,
'Cached': factorial_cached,
'Reduce': factorial_reduce
}
results = {}
for name, func in implementations.items():
start = datetime.now()
for _ in range(iterations):
func(n)
end = datetime.now()
duration = (end - start).total_seconds()
results[name] = duration
return results
# Run benchmark
n = 20
iterations = 1000
print(f"Benchmarking factorial implementations with n={n}, iterations={iterations}:")
results = benchmark(n, iterations)
# Print results
for name, duration in results.items():
print(f"{name:10} implementation took: {duration:.4f} seconds")
# Test correctness
test_n = 5
print(f"\nVerifying correctness with n={test_n}:")
results = {
'Recursive': factorial_recursive(test_n),
'Iterative': factorial_iterative(test_n),
'Cached': factorial_cached(test_n),
'Reduce': factorial_reduce(test_n)
}
for name, result in results.items():
print(f"{name:10} result: {result}")