From bfd143ca815fb3c96fe4d233225421f7fd4f03b3 Mon Sep 17 00:00:00 2001 From: Donne Martin Date: Sat, 30 May 2015 10:48:46 -0400 Subject: [PATCH] Added notebook solving the following: Implement fibonacci recursively, dynamically, and iteratively. --- README.md | 2 +- recursion-dynamic/fibonacci.ipynb | 145 ++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 recursion-dynamic/fibonacci.ipynb diff --git a/README.md b/README.md index e50207e..8bf545c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Most solutions are in Python. ## Recursion and Dynamic Programming -[Coming Soon] +* [Implement fibonacci recursively, dynamically, and iteratively](http://nbviewer.ipython.org/github/donnemartin/algorithms-data-structures/blob/master/recursion-dynamic/fibonacci.ipynb#) ## Trees and Graphs diff --git a/recursion-dynamic/fibonacci.ipynb b/recursion-dynamic/fibonacci.ipynb new file mode 100644 index 0000000..17963e7 --- /dev/null +++ b/recursion-dynamic/fibonacci.ipynb @@ -0,0 +1,145 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem: Implement fibonacci recursively, dynamically, and iteratively.\n", + "\n", + "* [Clarifying Questions](#Clarifying-Questions)\n", + "* [Test Cases](#Test-Cases)\n", + "* [Algorithm](#Algorithm)\n", + "* [Code](#Code)\n", + "* [Pythonic-Code](#Pythonic-Code)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clarifying Questions\n", + "\n", + "* None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test Cases\n", + "\n", + "* n = 0\n", + "* n = 1\n", + "* n > 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algorithm\n", + "\n", + "* Fibonacci is as follows: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34...\n", + "* If n = 0 or 1, return n\n", + "* Else return fib(n-1) + fib(n+2)\n", + "\n", + "Complexity:\n", + "* Time: O(2^n) if recursive or iterative, O(n) if dynamic\n", + "* Space: O(n) if recursive, O(1) if iterative, O(1) if dynamic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def fib_recursive(n):\n", + " if n == 0 or n == 1:\n", + " return n\n", + " else:\n", + " return fib(n-1) + fib(n-2)\n", + "\n", + "for i in xrange(0, 10):\n", + " print(fib_recursive(i))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "n = 7\n", + "cache = [None] * (n + 1)\n", + "\n", + "def fib_dynamic(n):\n", + " if n == 0 or n == 1:\n", + " return n\n", + " if cache[n] != None:\n", + " return cache[n]\n", + " cache[n] = fib_dynamic(n-1) + fib_dynamic(n-2)\n", + " return cache[n]\n", + "\n", + "for i in xrange(0, 10):\n", + " print(fib_dynamic(i))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def fib_iterative(n):\n", + " if n == 0 or n == 1:\n", + " return n\n", + " else:\n", + " n_minus_2 = 0 \n", + " n_minus_1 = 1\n", + " total = 0\n", + " for _ in xrange(2, n+1):\n", + " total = n_minus_2 + n_minus_1\n", + " n_minus_2, n_minus_1 = n_minus_1, total\n", + " return total\n", + "\n", + "for i in xrange(0, 10):\n", + " print(fib_iterative(i))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}