|
|
""" |
|
|
Fibonacci computation functions for testing function analysis. |
|
|
""" |
|
|
|
|
|
def fibonacci_recursive(n): |
|
|
"""Calculate fibonacci number using recursion.""" |
|
|
if n <= 1: |
|
|
return n |
|
|
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2) |
|
|
|
|
|
|
|
|
def fibonacci_iterative(n): |
|
|
"""Calculate fibonacci number using iteration.""" |
|
|
if n <= 1: |
|
|
return n |
|
|
|
|
|
a, b = 0, 1 |
|
|
for _ in range(2, n + 1): |
|
|
a, b = b, a + b |
|
|
return b |
|
|
|
|
|
|
|
|
def fibonacci_memoized(n, memo=None): |
|
|
"""Calculate fibonacci number using memoization.""" |
|
|
if memo is None: |
|
|
memo = {} |
|
|
|
|
|
if n in memo: |
|
|
return memo[n] |
|
|
|
|
|
if n <= 1: |
|
|
memo[n] = n |
|
|
return n |
|
|
|
|
|
memo[n] = fibonacci_memoized(n - 1, memo) + fibonacci_memoized(n - 2, memo) |
|
|
return memo[n] |
|
|
|
|
|
|
|
|
def fibonacci_sequence(count): |
|
|
"""Generate a sequence of fibonacci numbers.""" |
|
|
sequence = [] |
|
|
for i in range(count): |
|
|
sequence.append(fibonacci_iterative(i)) |
|
|
return sequence |
|
|
|
|
|
|
|
|
def compare_fibonacci_methods(n): |
|
|
"""Compare different fibonacci calculation methods.""" |
|
|
import time |
|
|
|
|
|
methods = [ |
|
|
("Recursive", fibonacci_recursive), |
|
|
("Iterative", fibonacci_iterative), |
|
|
("Memoized", fibonacci_memoized) |
|
|
] |
|
|
|
|
|
results = {} |
|
|
for name, func in methods: |
|
|
start_time = time.time() |
|
|
result = func(n) |
|
|
end_time = time.time() |
|
|
results[name] = { |
|
|
'result': result, |
|
|
'time': end_time - start_time |
|
|
} |
|
|
|
|
|
return results |
|
|
|
|
|
|
|
|
def validate_fibonacci_result(n, result): |
|
|
"""Validate if a fibonacci result is correct.""" |
|
|
if n <= 1: |
|
|
return result == n |
|
|
|
|
|
|
|
|
expected = fibonacci_iterative(n) |
|
|
return result == expected |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
n = 10 |
|
|
print(f"Fibonacci({n}) using different methods:") |
|
|
|
|
|
results = compare_fibonacci_methods(n) |
|
|
for method, data in results.items(): |
|
|
print(f"{method}: {data['result']} (took {data['time']:.6f} seconds)") |
|
|
|
|
|
print(f"\nFirst 15 fibonacci numbers: {fibonacci_sequence(15)}") |
|
|
|