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 :math:`f_{n-1}` requires calculating Fibonacci number :math:`f_{n-2}`, which is also required for calculating Fibonacci number :math:`f_n`. This means there is redundant computation. This redundancy gets worse for numbers :math:`f_{n-3}`, :math:`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 :math:`f_2`, then :math:`f_3`, then :math:`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.