      "    * Move remaining element from src to dest\n",
      "    * hanoi(n-1, buffer, dest)    \n",
      "\n",
      "Complexity:\n",
      "* Time: O(2^n - 1)\n",
      "* Space: O(m) where m is the number of recursion levels"
     ]
    },
    {
     "cell_type": "markdown",
 
</s> remove     "* None"
 </s> add     "*Problem statements are often intentionally ambiguous.  Identifying constraints and stating assumptions can help to ensure you code the intended solution.*\n",
    "\n",
    "* Can we assume we already have a stack class that can be used for this problem?\n",
    "    * Yes" </s> remove     "* [Clarifying Questions](#Clarifying-Questions)\n",
 </s> add     "* [Constraints and Assumptions](#Constraints-and-Assumptions)\n", </s> remove     "print('NULL towers')\n",
    "hanoi(num_disks, None, None, None)\n",
    "first = Stack()\n",
    "second = Stack()\n",
    "third = Stack()\n",
    "print('0 disks')\n",
    "hanoi(num_disks, first, third, second)\n",
    "print('1 disk')\n",
    "first.push(5)\n",
    "hanoi(num_disks, first, third, second)\n",
    "print(third.pop())\n",
    "print('2 or more disks')\n",
    "num_disks = 3\n",
    "for i in xrange(num_disks, -1, -1):\n",
    "    first.push(i)\n",
    "hanoi(num_disks, first, third, second)\n",
    "for i in xrange(0, num_disks):\n",
    "    print(third.pop())"
 </s> add     "from nose.tools import assert_equal\n",
    "\n",
    "class Test(object):\n",
    "    def test_hanoi(self):\n",
    "        num_disks = 3\n",
    "        src = Stack()\n",
    "        buff = Stack()\n",
    "        dest = Stack()\n",
    "\n",
    "        print('Test: NULL towers')\n",
    "        hanoi(num_disks, None, None, None)\n",
    "\n",
    "        print('Test: 0 disks')\n",
    "        hanoi(num_disks, src, dest, buff)\n",
    "        assert_equal(dest.pop(), None)\n",
    "\n",
    "        print('Test: 1 disk')\n",
    "        src.push(5)\n",
    "        hanoi(num_disks, src, dest, buff)\n",
    "        assert_equal(dest.pop(), 5)\n",
    "\n",
    "        print('Test: 2 or more disks')\n",
    "        for i in xrange(num_disks, -1, -1):\n",
    "            src.push(i)\n",
    "        hanoi(num_disks, src, dest, buff)\n",
    "        for i in xrange(0, num_disks):\n",
    "            assert_equal(dest.pop(), i)\n",
    "\n",
    "        print('Success: test_hanoi')\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    test = Test()\n",
    "    test.test_hanoi()" </s> remove     "* [Code](#Code)"
 </s> add     "* [Code](#Code)\n",
    "* [Unit Test](#Unit-Test)"
    "* Time: O(2^n)\n",
      "    * Move remaining element from src to dest\n",
      "    * hanoi(n-1, buffer, dest)    \n",
      "\n",
      "Complexity:\n",
    "* Time: O(2^n)\n",
      "* Space: O(m) where m is the number of recursion levels"
     ]
    },
    {
     "cell_type": "markdown",
keep keep keep keep replace keep keep keep keep keep
 Reworked notebook: Added more detail to constraints and test cases.  Reworked algorithm discussion and unit test. 
stacks-queues/hanoi.ipynb