diff --git a/recursion_dynamic/fibonacci/fibonacci_challenge.ipynb b/recursion_dynamic/fibonacci/fibonacci_challenge.ipynb new file mode 100644 index 0000000..2df0745 --- /dev/null +++ b/recursion_dynamic/fibonacci/fibonacci_challenge.ipynb @@ -0,0 +1,168 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook was prepared by [Donne Martin](http://donnemartin.com). Source and license info is on [GitHub](https://bit.ly/code-notes)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problem: Implement fibonacci recursively, dynamically, and iteratively.\n", + "\n", + "* [Constraints](#Constraints)\n", + "* [Test Cases](#Test-Cases)\n", + "* [Algorithm](#Algorithm)\n", + "* [Code](#Code)\n", + "* [Unit Test](#Unit-Test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Constraints\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" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Test Cases\n", + "\n", + "* n = 0 -> 0\n", + "* n = 1 -> 0\n", + "* n > 1 -> 0, 1, 1, 2, 3, 5, 8, 13, 21, 34..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algorithm\n", + "\n", + "Refer to the solution notebook. If you are stuck and need a hint, the solution notebook's algorithm discussion might be a good place to start." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def fib_recursive(n):\n", + " # TODO: Implement me\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "num_items = 10\n", + "cache = [None] * (num_items + 1)\n", + "\n", + "def fib_dynamic(n):\n", + " # TODO: Implement me\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def fib_iterative(n):\n", + " # TODO: Implement me\n", + " pass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Unit Test\n", + "\n", + "*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.*\n", + "\n", + "**The following unit test is expected to fail until you solve the challenge.**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# %load test_fibonacci.py\n", + "from nose.tools import assert_equal\n", + "\n", + "\n", + "class TestFib(object):\n", + " \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", + "def main():\n", + " test = TestFib()\n", + " test.test_fib(fib_recursive)\n", + " test.test_fib(fib_dynamic)\n", + " test.test_fib(fib_iterative)\n", + "\n", + "if __name__ == '__main__':\n", + " main()" + ] + } + ], + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/recursion_dynamic/fibonacci/fibonacci_solution.ipynb b/recursion_dynamic/fibonacci/fibonacci_solution.ipynb index 98d8e02..3f2cf23 100644 --- a/recursion_dynamic/fibonacci/fibonacci_solution.ipynb +++ b/recursion_dynamic/fibonacci/fibonacci_solution.ipynb @@ -16,9 +16,7 @@ "* [Constraints](#Constraints)\n", "* [Test Cases](#Test-Cases)\n", "* [Algorithm](#Algorithm)\n", - "* [Code: Recursive](#Code:-Recursive)\n", - "* [Code: Dynamic](#Code:-Dynamic)\n", - "* [Code: Iterative](#Code:-Iterative)\n", + "* [Code](#Code)\n", "* [Unit Test](#Unit-Test)" ] }, @@ -39,9 +37,9 @@ "source": [ "## Test Cases\n", "\n", - "* n = 0\n", - "* n = 1\n", - "* n > 1" + "* n = 0 -> 0\n", + "* n = 1 -> 0\n", + "* n > 1 -> 0, 1, 1, 2, 3, 5, 8, 13, 21, 34..." ] }, { @@ -56,14 +54,14 @@ "\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" + "* Space: O(n) if recursive, O(1) if iterative, O(n) if dynamic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Code: Recursive" + "## Code" ] }, { @@ -81,13 +79,6 @@ " return fib_recursive(n-1) + fib_recursive(n-2)" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code: Dynamic" - ] - }, { "cell_type": "code", "execution_count": 2, @@ -108,13 +99,6 @@ " return cache[n]" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code: Iterative" - ] - }, { "cell_type": "code", "execution_count": 3, @@ -151,16 +135,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "Success: test_fib\n", - "Success: test_fib\n", - "Success: test_fib\n" + "Overwriting test_fibonacci.py\n" ] } ], "source": [ + "%%writefile test_fibonacci.py\n", "from nose.tools import assert_equal\n", "\n", - "class Test(object):\n", + "\n", + "class TestFib(object):\n", + " \n", " def test_fib(self, func):\n", " result = []\n", " for i in xrange(num_items):\n", @@ -169,11 +154,35 @@ " assert_equal(result, fib_seq)\n", " print('Success: test_fib')\n", "\n", - "if __name__ == '__main__':\n", - " test = Test()\n", + "def main():\n", + " test = TestFib()\n", " test.test_fib(fib_recursive)\n", " test.test_fib(fib_dynamic)\n", - " test.test_fib(fib_iterative)" + " test.test_fib(fib_iterative)\n", + "\n", + "if __name__ == '__main__':\n", + " main()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success: test_fib\n", + "Success: test_fib\n", + "Success: test_fib\n" + ] + } + ], + "source": [ + "%run -i test_fibonacci.py" ] } ], diff --git a/recursion_dynamic/fibonacci/test_fibonacci.py b/recursion_dynamic/fibonacci/test_fibonacci.py new file mode 100644 index 0000000..07812b5 --- /dev/null +++ b/recursion_dynamic/fibonacci/test_fibonacci.py @@ -0,0 +1,21 @@ +from nose.tools import assert_equal + + +class TestFib(object): + + def test_fib(self, func): + result = [] + for i in xrange(num_items): + result.append(func(i)) + fib_seq = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] + assert_equal(result, fib_seq) + print('Success: test_fib') + +def main(): + test = TestFib() + test.test_fib(fib_recursive) + test.test_fib(fib_dynamic) + test.test_fib(fib_iterative) + +if __name__ == '__main__': + main() \ No newline at end of file