# Lecture 23 — Exercises¶

Solutions to the problems below must be sent to Submitty for automatic
scoring. A separate file must submitted for each problem. Start by
downloading *lec23_ex.zip* from the Piazza site. Solutions
must be submitted by 4 pm on Tuesday, April 25.

The following code recursively calculates the maximum value in a list.

def recursive_max_impl( L, i ): ''' The actual recursive function. ''' if i == len(L)-1: return L[i] else: return max(L[i], recursive_max_impl(L,i+1) ) def recursive_max( L ): ''' The driver for the recursive function. This handles the special case of an empty list and otherwise makes the initial call to the recursive function. ''' if len(L) == 0: return -99999 # By convention else: return recursive_max_impl( L, 0 ) if __name__ == "__main__": L1 = [ 5 ] print(recursive_max( L1 )) L2 = [ 24, 23.1, 12, 15, 1 ] print(recursive_max( L2)) L2.append( 55 ) print(recursive_max( L2 ))

Using this as a guide, write a recursive function to add the values in a list. You should have to change very little code. Implement your code in the provided file

`prob1.py`

Implement a recursive solution to the Fibonacci number function definition given during lecture. Implement your code in the provided file

`prob2.py`

.Looking carefully at the Fibonacci definition shows that calculating Fibonacci number \(f_{n-1}\) requires calculating Fibonacci number \(f_{n-2}\), which is also required for calculating Fibonacci number \(f_n\). This means there is redundant computation. This redundancy gets worse for numbers \(f_{n-3}\), \(f_{n-4}\), etc.

Fortunately, the Fibonacci sequence is relatively easy to compute non-recursively. That is your problem here. The trick is to build up the solution using a for loop that calculates \(f_2\), then \(f_3\), then \(f_4\), etc. Implement your solution in

`prob3.py`

.Out of curiosity, you could run your solutions to the previous two problems on large values of n and time the difference.