| """ |
| 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)}") |
|
|