# Functional Programming

Functional Programming is a Programming Paradigm in which programs are mostly built by applying and composing functions.

## Reducer

A **reducer** is a function that iterates over a list, applying a certain operation to all elements. On each call, it sends the previous result as well as the next element on the list. Only the last result is preserved.

**Iterative**:

```
def reduce(fn, lst):
res = lst[0]
for x in lst[1:]:
res = fn(res, x)
return res
```

**Recursive**:

```
def reduce(fn , lst):
if len(lst) == 1:
return lst[0]
else:
return fn(lst[0], reduce(fn, lst[1:]))
```

## Filter

A **filter** receives a predicate and a list and then it checks for the elements that satisfy the predicate. Only those are returned.

**Iterative**:

```
def filter(fn, lst):
res = []
for x in lst:
if fn(x):
res = res + [x]
return res
```

**Recursive**:

```
def filter(fn, lst):
if lst == []:
return lst
elif fn(lst[0]):
return [lst[0]] + filter(fn, lst[1:])
else:
return filter(fn, lst[1:])
```

## Map

A **map** transforms a certain list by applying the same operation to all elements.

**Iterative**:

```
def map(fn, lst):
res = list()
for e in lst:
res = res + [fn(e)]
return res
```

**Recursive**:

```
def map(fn, lst):
if lst == []:
return lst
else:
return [fn(lst[0])] + map(fn, lst[1:])
```