# Recursion Part 5: Exercises in tail recursion

Try out the following problems: Ask any questions/answers in the comments.

Is this tail recursion?

```
def fibonacci(n):
if (n <= 2):
return 1
return fibonacci(n - 2) + fibonacci(n - 1)
```

What about this?

```
def find_root(node):
if node.parent is None:
return node
return find_root(node.parent)
```

And this?

```
def find_node(node, data_to_find):
if node is None:
return None
if node.data == data_to_find:
return node
return find_node(node.next, data_to_find)
```

Try converting the above three programs to iterative versions. Do you find some harder than the others?

Now lets do the reverse. Convert this iterative program into a tail recursive version. First convert it to an accumulator based function and then convert that to an ordinary tail recursive version. Hint: First convert the for loop into a while loop.

```
def sum_of_first_n_numbers(n):
sum = 0
for i in range(n + 1):
sum = sum + i
return sum
```

How about this one? Assume all numbers are positive (> 0). Hint: The accumulator does not always have to perform some mathematical operation. It can also be used to keep track of the state so far.

```
def find_max(number_list):
maximum = 0
for num in number_list:
if num > maximum:
maximum = num
return max
```