In this lesson, you’ll go over the **Fibonacci** series and see how to solve it recursively. You’ll also learn how to use a **cache** to drastically improve runtime:

```
from functools import lru_cache
def fibonacci_recursive(n):
# base cases
if n == 0:
return 0
elif n == 1:
return 1
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
@lru_cache(maxsize=None)
def fibonacci_recursive_optimized(n):
# base cases
if n == 0:
return 0
elif n == 1:
return 1
return fibonacci_recursive_optimized(n - 1) + fibonacci_recursive_optimized(n - 2)
```