From dd79e20c4b8851ec789b6a204ff1bef1459be7ae Mon Sep 17 00:00:00 2001 From: Donne Martin Date: Sat, 27 Jun 2015 06:40:29 -0400 Subject: [PATCH] Reworked notebook: Added more detail to constraints and test cases. Reworked code and unit test. --- recursion-dynamic/fibonacci.ipynb | 112 +++++++++++++++++++++--------- 1 file changed, 78 insertions(+), 34 deletions(-) diff --git a/recursion-dynamic/fibonacci.ipynb b/recursion-dynamic/fibonacci.ipynb index fbe7711..a37709c 100644 --- a/recursion-dynamic/fibonacci.ipynb +++ b/recursion-dynamic/fibonacci.ipynb @@ -13,18 +13,22 @@ "source": [ "## Problem: Implement fibonacci recursively, dynamically, and iteratively.\n", "\n", - "* [Clarifying Questions](#Clarifying-Questions)\n", + "* [Constraints and Assumptions](#Constraints-and-Assumptions)\n", "* [Test Cases](#Test-Cases)\n", "* [Algorithm](#Algorithm)\n", - "* [Code](#Code)\n", - "* [Pythonic-Code](#Pythonic-Code)" + "* [Code: Recursive](#Code:-Recursive)\n", + "* [Code: Dynamic](#Code:-Dynamic)\n", + "* [Code: Iterative](#Code:-Iterative)\n", + "* [Unit Test](#Unit-Test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Clarifying Questions\n", + "## Constraints and Assumptions\n", + "\n", + "*Problem statements are often intentionally ambiguous. Identifying constraints and stating assumptions can help to ensure you code the intended solution.*\n", "\n", "* None" ] @@ -59,23 +63,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Code" + "## Code: Recursive" ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "num_items = 10" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": false }, @@ -85,20 +78,25 @@ " if n == 0 or n == 1:\n", " return n\n", " else:\n", - " return fib_recursive(n-1) + fib_recursive(n-2)\n", - "\n", - "for i in xrange(num_items):\n", - " print(fib_recursive(i))" + " return fib_recursive(n-1) + fib_recursive(n-2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code: Dynamic" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ + "num_items = 10\n", "cache = [None] * (num_items + 1)\n", "\n", "def fib_dynamic(n):\n", @@ -107,29 +105,75 @@ " 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(num_items):\n", - " print(fib_dynamic(i))" + " return cache[n]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code: Iterative" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def fib_iterative(n):\n", - " a = 0 \n", - " b = 1\n", - " for _ in xrange(n):\n", - " a, b = b, a + b\n", - " return a\n", + " a = 0 \n", + " b = 1\n", + " for _ in xrange(n):\n", + " a, b = b, a + b\n", + " return a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Unit Test\n", "\n", - "for i in xrange(num_items):\n", - " print(fib_iterative(i))" + "*It is important to identify and run through general and edge cases from the [Test Cases](#Test-Cases) section by hand. You generally will not be asked to write a unit test like what is shown below.*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success: test_fib\n", + "Success: test_fib\n", + "Success: test_fib\n" + ] + } + ], + "source": [ + "from nose.tools import assert_equal\n", + "\n", + "class Test(object):\n", + " def test_fib(self, func):\n", + " result = []\n", + " for i in xrange(num_items):\n", + " result.append(func(i))\n", + " fib_seq = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]\n", + " assert_equal(result, fib_seq)\n", + " print('Success: test_fib')\n", + "\n", + "if __name__ == '__main__':\n", + " test = Test()\n", + " test.test_fib(fib_recursive)\n", + " test.test_fib(fib_dynamic)\n", + " test.test_fib(fib_iterative)" ] } ],