---
layout: post
title:  "day 10"
date:  2018-01-11
categories: programming
---

# 100 Days of Code

### Day 10:
Made fibonacci programs from tutorials I found on youtube. One that introduces
the concept of memoization or storing results of recent function calls to
improve the speed of the recursive function. Also a basic bubblesort program in python
that I found from another tutorial. This is very basic stuff but I want to make sure I
know as much foundational knowledge as I can. Socrataca on youtube is a great
channel with lots of math and science themed videos. That is where I found
these tutorials. Here is a
[link](https://www.youtube.com/watch?v=Qk0zUZW-U_M&list=PLi01XoE8jYohWFPpC17Z-wWhPOSuh8Er-&index=18)
to the python video on the fibonacci sequence.
##### No Cache

```python

#!/usr/bin/env python3
# this shows the fibonacci sequence with basic recursion.
# note that it gets very slow at the end due to the recursion


def fibonacci(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    elif n > 2:
        return fibonacci(n-1) + fibonacci(n-2)


for n in range(1, 101):
    print(n, ":", fibonacci(n))
```
#### Cache
```python

#!/usr/bin/env python3
# this introduces recursive fibonacci with a cache of recent function calls
# this is introducing memoization: caching recent function call results

fibonacci_cache = {}


def fibonacci(n):
    # If we have cached the value, then return it
    if n in fibonacci_cache:
        return fibonacci_cache[n]

    # compute nth term
    if n == 1:
        value = 1
    elif n == 2:
        value = 1
    elif n > 2:
        value = fibonacci(n-1) + fibonacci(n-2)

    fibonacci_cache[n] = value
    return value


for n in range(1, 101):
    print(n, ":", fibonacci(n))
```
#### Cache using functools lru_cache
```python
#!/usr/bin/env python3
from functools import lru_cache

@lru_cache(maxsize = 1000)
def fibonacci(n):
    # check if type is positive int
    if type(n) != int:
        raise TypeError("n must be a positive int")
    if n < 1:
        raise ValueError("n must be a positive int")

    if n == 1:
        return 1
    elif n == 2:
        return 1
    elif n > 2:
        return fibonacci(n-1) + fibonacci(n-2)


for n in range(1, 501):
    print(n, ":", fibonacci(n))
```

