summaryrefslogtreecommitdiff
path: root/Data_Structures_and_Algorithms_in_Java/ch6.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'Data_Structures_and_Algorithms_in_Java/ch6.ipynb')
-rw-r--r--Data_Structures_and_Algorithms_in_Java/ch6.ipynb505
1 files changed, 470 insertions, 35 deletions
diff --git a/Data_Structures_and_Algorithms_in_Java/ch6.ipynb b/Data_Structures_and_Algorithms_in_Java/ch6.ipynb
index 483043b8..c95d1bf1 100644
--- a/Data_Structures_and_Algorithms_in_Java/ch6.ipynb
+++ b/Data_Structures_and_Algorithms_in_Java/ch6.ipynb
@@ -1,6 +1,7 @@
{
"metadata": {
- "name": "ch6"
+ "name": "",
+ "signature": "sha256:de38e9569976fe6e7666e16fc87eae62ca1e6843703b45eeabd018f73553dc8b"
},
"nbformat": 3,
"nbformat_minor": 0,
@@ -11,36 +12,59 @@
"cell_type": "heading",
"level": 1,
"metadata": {},
- "source": "Chapter 6 : Recursion"
+ "source": [
+ "Chapter 6 : Recursion"
+ ]
},
{
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.1 Page No : 255"
+ "source": [
+ "Example 6.1 Page No : 255"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nExample 6.1\nevaluates triangular numbers\n'''\n\ndef triangle(n):\n if(n==1):\n return 1\n else:\n return( n + triangle(n-1) )\n\nprint 'Enter a number: ' ,\ntheNumber = int(raw_input())\ntheAnswer = triangle(theNumber)\nprint 'Triangle = ' , theAnswer\n",
+ "input": [
+ " \n",
+ "\n",
+ "def triangle(n):\n",
+ " if(n==1):\n",
+ " return 1\n",
+ " else:\n",
+ " return( n + triangle(n-1) )\n",
+ "\n",
+ "print 'Enter a number: ' ,\n",
+ "theNumber = int(raw_input())\n",
+ "theAnswer = triangle(theNumber)\n",
+ "print 'Triangle = ' , theAnswer\n"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": " Enter a number: "
+ "text": [
+ " Enter a number: "
+ ]
},
{
"name": "stdout",
"output_type": "stream",
"stream": "stdout",
- "text": "50\n"
+ "text": [
+ "50\n"
+ ]
},
{
"output_type": "stream",
"stream": "stdout",
- "text": " Triangle = 1275\n"
+ "text": [
+ " Triangle = 1275\n"
+ ]
}
],
"prompt_number": 11
@@ -49,30 +73,88 @@
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.2 Page No : 265"
+ "source": [
+ "Example 6.2 Page No : 265"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nexample 6.2\ncreates anagrams\n'''\narrChar = []\nsize = 0\ncount = 0\ndef doAnagram(newSize):\n if(newSize == 1): # if too small,\n return\n for j in range(newSize): # for each position,\n doAnagram(newSize-1) # anagram remaining\n if(newSize==2): # if innermost,\n displayWord()\n rotate(newSize);\n\ndef rotate(newSize):\n global size\n global arrChar\n position = size - newSize\n temp = arrChar[position]\n for j in range(position+1,size):\n # shift others left\n arrChar[j-1] = arrChar[j]\n arrChar[size-1] = temp;\n\ndef displayWord():\n global count\n global size\n global arrChar\n if(count < 99):\n print ' ' ,\n if(count < 9):\n print ' ' ,\n count += 1\n print count ,\n for j in range(size):\n print arrChar[j] ,\n print '' ,\n if(count%6 == 0):\n print ''\n\nprint 'Enter a word: '\ni = raw_input()\n#global size\nsize = len(i)\nfor j in range(size):\n arrChar.append(i[j])\ndoAnagram(size)\n",
+ "input": [
+ " \n",
+ "arrChar = []\n",
+ "size = 0\n",
+ "count = 0\n",
+ "def doAnagram(newSize):\n",
+ " if(newSize == 1): # if too small,\n",
+ " return\n",
+ " for j in range(newSize): # for each position,\n",
+ " doAnagram(newSize-1) # anagram remaining\n",
+ " if(newSize==2): # if innermost,\n",
+ " displayWord()\n",
+ " rotate(newSize);\n",
+ "\n",
+ "def rotate(newSize):\n",
+ " global size\n",
+ " global arrChar\n",
+ " position = size - newSize\n",
+ " temp = arrChar[position]\n",
+ " for j in range(position+1,size):\n",
+ " # shift others left\n",
+ " arrChar[j-1] = arrChar[j]\n",
+ " arrChar[size-1] = temp;\n",
+ "\n",
+ "def displayWord():\n",
+ " global count\n",
+ " global size\n",
+ " global arrChar\n",
+ " if(count < 99):\n",
+ " print ' ' ,\n",
+ " if(count < 9):\n",
+ " print ' ' ,\n",
+ " count += 1\n",
+ " print count ,\n",
+ " for j in range(size):\n",
+ " print arrChar[j] ,\n",
+ " print '' ,\n",
+ " if(count%6 == 0):\n",
+ " print ''\n",
+ "\n",
+ "print 'Enter a word: '\n",
+ "i = raw_input()\n",
+ "#global size\n",
+ "size = len(i)\n",
+ "for j in range(size):\n",
+ " arrChar.append(i[j])\n",
+ "doAnagram(size)\n"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": "Enter a word: \n"
+ "text": [
+ "Enter a word: \n"
+ ]
},
{
"name": "stdout",
"output_type": "stream",
"stream": "stdout",
- "text": "cats\n"
+ "text": [
+ "cats\n"
+ ]
},
{
"output_type": "stream",
"stream": "stdout",
- "text": " 1 c a t s 2 c a s t 3 c t s a 4 c t a s 5 c s a t 6 c s t a \n 7 a t s c 8 a t c s 9 a s c t 10 a s t c 11 a c t s 12 a c s t \n 13 t s c a 14 t s a c 15 t c a s 16 t c s a 17 t a s c 18 t a c s \n 19 s c a t 20 s c t a 21 s a t c 22 s a c t 23 s t c a 24 s t a c \n"
+ "text": [
+ " 1 c a t s 2 c a s t 3 c t s a 4 c t a s 5 c s a t 6 c s t a \n",
+ " 7 a t s c 8 a t c s 9 a s c t 10 a s t c 11 a c t s 12 a c s t \n",
+ " 13 t s c a 14 t s a c 15 t c a s 16 t c s a 17 t a s c 18 t a c s \n",
+ " 19 s c a t 20 s c t a 21 s a t c 22 s a c t 23 s t c a 24 s t a c \n"
+ ]
}
],
"prompt_number": 19
@@ -81,19 +163,82 @@
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.3 Page No : 269"
+ "source": [
+ "Example 6.3 Page No : 269"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nLISTING 6.3\ndemonstrates recursive binary search\n'''\nclass ordArray:\n def __init__(self,m): # constructor\n self.a = []\n self.nElems = 0\n def size(self):\n return self.nElems\n\n def find(self,searchKey):\n return self.recFind(searchKey, 0, self.nElems-1)\n\n def recFind(self,searchKey,lowerBound,upperBound):\n curIn = (lowerBound + upperBound ) / 2\n if(self.a[curIn]==searchKey):\n return curIn # found it\n elif(lowerBound > upperBound):\n return self.nElems # cant find it\n else: # divide range\n if(self.a[curIn] < searchKey): # its in upper half\n return self.recFind(searchKey, curIn+1, upperBound)\n else: # its in lower half\n return self.recFind(searchKey, lowerBound, curIn-1)\n\n def insert(self,value): # put element into array\n self.a.append(value)\n self.a.sort()\n self.nElems += 1\n\n def display(self): # displays array contents\n for j in range(self.nElems): # for each element,\n print self.a[j] , \n print ''\n\nmaxSize = 100 # array size\narr = ordArray(maxSize) # create the array\narr.insert(72)\narr.insert(90)\narr.insert(45)\narr.insert(126)\narr.insert(54)\narr.insert(99)\narr.insert(144)\narr.insert(27)\narr.insert(135)\narr.insert(81)\narr.insert(18)\narr.insert(108)\narr.insert(9)\narr.insert(117)\narr.insert(63)\narr.insert(36)\narr.display() # display array\nsearchKey = 27 # search for item\nif( arr.find(searchKey) != arr.size()):\n print 'Found ' , searchKey\nelse:\n print \"Can't find \" , searchKey",
+ "input": [
+ " \n",
+ "class ordArray:\n",
+ " def __init__(self,m): # constructor\n",
+ " self.a = []\n",
+ " self.nElems = 0\n",
+ " def size(self):\n",
+ " return self.nElems\n",
+ "\n",
+ " def find(self,searchKey):\n",
+ " return self.recFind(searchKey, 0, self.nElems-1)\n",
+ "\n",
+ " def recFind(self,searchKey,lowerBound,upperBound):\n",
+ " curIn = (lowerBound + upperBound ) / 2\n",
+ " if(self.a[curIn]==searchKey):\n",
+ " return curIn # found it\n",
+ " elif(lowerBound > upperBound):\n",
+ " return self.nElems # cant find it\n",
+ " else: # divide range\n",
+ " if(self.a[curIn] < searchKey): # its in upper half\n",
+ " return self.recFind(searchKey, curIn+1, upperBound)\n",
+ " else: # its in lower half\n",
+ " return self.recFind(searchKey, lowerBound, curIn-1)\n",
+ "\n",
+ " def insert(self,value): # put element into array\n",
+ " self.a.append(value)\n",
+ " self.a.sort()\n",
+ " self.nElems += 1\n",
+ "\n",
+ " def display(self): # displays array contents\n",
+ " for j in range(self.nElems): # for each element,\n",
+ " print self.a[j] , \n",
+ " print ''\n",
+ "\n",
+ "maxSize = 100 # array size\n",
+ "arr = ordArray(maxSize) # create the array\n",
+ "arr.insert(72)\n",
+ "arr.insert(90)\n",
+ "arr.insert(45)\n",
+ "arr.insert(126)\n",
+ "arr.insert(54)\n",
+ "arr.insert(99)\n",
+ "arr.insert(144)\n",
+ "arr.insert(27)\n",
+ "arr.insert(135)\n",
+ "arr.insert(81)\n",
+ "arr.insert(18)\n",
+ "arr.insert(108)\n",
+ "arr.insert(9)\n",
+ "arr.insert(117)\n",
+ "arr.insert(63)\n",
+ "arr.insert(36)\n",
+ "arr.display() # display array\n",
+ "searchKey = 27 # search for item\n",
+ "if( arr.find(searchKey) != arr.size()):\n",
+ " print 'Found ' , searchKey\n",
+ "else:\n",
+ " print \"Can't find \" , searchKey"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": "9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144 \nFound 27\n"
+ "text": [
+ "9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144 \n",
+ "Found 27\n"
+ ]
}
],
"prompt_number": 13
@@ -102,19 +247,42 @@
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.4 Page No : 278"
+ "source": [
+ "Example 6.4 Page No : 278"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nexample 6.4\nsolves the towers of Hanoi puzzle\n'''\ndef doTowers(topN,frm,inter,to):\n if(topN==1):\n print \"Disk 1 from \" , frm , \"to \" , to\n else:\n doTowers(topN-1, frm, to, inter) # from-->inter\n print \"Disk \" , topN ,\" from \" , frm , \" to \" , to\n doTowers(topN-1, inter, frm, to) # inter-->to\n\n\nnDisks = 3\ndoTowers(nDisks, 'A', 'B', 'C')\n",
+ "input": [
+ " \n",
+ "def doTowers(topN,frm,inter,to):\n",
+ " if(topN==1):\n",
+ " print \"Disk 1 from \" , frm , \"to \" , to\n",
+ " else:\n",
+ " doTowers(topN-1, frm, to, inter) # from-->inter\n",
+ " print \"Disk \" , topN ,\" from \" , frm , \" to \" , to\n",
+ " doTowers(topN-1, inter, frm, to) # inter-->to\n",
+ "\n",
+ "\n",
+ "nDisks = 3\n",
+ "doTowers(nDisks, 'A', 'B', 'C')\n"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": "Disk 1 from A to C\nDisk 2 from A to B\nDisk 1 from C to B\nDisk 3 from A to C\nDisk 1 from B to A\nDisk 2 from B to C\nDisk 1 from A to C\n"
+ "text": [
+ "Disk 1 from A to C\n",
+ "Disk 2 from A to B\n",
+ "Disk 1 from C to B\n",
+ "Disk 3 from A to C\n",
+ "Disk 1 from B to A\n",
+ "Disk 2 from B to C\n",
+ "Disk 1 from A to C\n"
+ ]
}
],
"prompt_number": 14
@@ -123,19 +291,59 @@
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.5 Page no : 281"
+ "source": [
+ "Example 6.5 Page no : 281"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nexample 6.5\ndemonstrates merging two arrays into a third\n'''\n# merge A and B into C\ndef merge(arrayA,sizeA,arrayB,sizeB,arrayC ):\n aDex=0\n bDex=0\n cDex=0\n while(aDex < sizeA and bDex < sizeB): # neither array empty\n if( arrayA[aDex] < arrayB[bDex] ):\n arrayC.append(arrayA[aDex])\n cDex += 1\n aDex += 1\n else:\n arrayC.append(arrayB[bDex])\n cDex += 1\n bDex += 1\n while(aDex < sizeA):\n arrayC.append(arrayA[aDex])\n cDex += 1\n aDex += 1\n while(bDex < sizeB):\n arrayC.append(arrayB[bDex]) # but arrayB isnt\n cDex +=1\n bDex += 1\n\ndef display(theArray,size):\n for j in range(size):\n print theArray[j],\n\n\n\narrayA = [23, 47, 81, 95]\narrayB = [7, 14, 39, 55, 62, 74]\narrayC = []\nmerge(arrayA, 4, arrayB, 6, arrayC)\ndisplay(arrayC, 10)\n",
+ "input": [
+ " \n",
+ "# merge A and B into C\n",
+ "def merge(arrayA,sizeA,arrayB,sizeB,arrayC ):\n",
+ " aDex=0\n",
+ " bDex=0\n",
+ " cDex=0\n",
+ " while(aDex < sizeA and bDex < sizeB): # neither array empty\n",
+ " if( arrayA[aDex] < arrayB[bDex] ):\n",
+ " arrayC.append(arrayA[aDex])\n",
+ " cDex += 1\n",
+ " aDex += 1\n",
+ " else:\n",
+ " arrayC.append(arrayB[bDex])\n",
+ " cDex += 1\n",
+ " bDex += 1\n",
+ " while(aDex < sizeA):\n",
+ " arrayC.append(arrayA[aDex])\n",
+ " cDex += 1\n",
+ " aDex += 1\n",
+ " while(bDex < sizeB):\n",
+ " arrayC.append(arrayB[bDex]) # but arrayB isnt\n",
+ " cDex +=1\n",
+ " bDex += 1\n",
+ "\n",
+ "def display(theArray,size):\n",
+ " for j in range(size):\n",
+ " print theArray[j],\n",
+ "\n",
+ "\n",
+ "\n",
+ "arrayA = [23, 47, 81, 95]\n",
+ "arrayB = [7, 14, 39, 55, 62, 74]\n",
+ "arrayC = []\n",
+ "merge(arrayA, 4, arrayB, 6, arrayC)\n",
+ "display(arrayC, 10)\n"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": "7 14 23 39 47 55 62 74 81 95\n"
+ "text": [
+ "7 14 23 39 47 55 62 74 81 95\n"
+ ]
}
],
"prompt_number": 15
@@ -144,19 +352,97 @@
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.6 Page no : 288"
+ "source": [
+ "Example 6.6 Page no : 288"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nexample 6.6\ndemonstrates recursive merge sort\n'''\n\nclass DArray:\n def __init__(self,m):\n self.theArray = []\n self.nElems = 0\n \n def insert(self,value):\n self.theArray.append(value)\n self.nElems += 1\n\n def display(self): # displays array contents\n for j in range(self.nElems):\n print self.theArray[j] ,\n print ''\n\n def mergeSort(self):\n workSpace = []\n for i in range(self.nElems):\n workSpace.append(0)\n self.recMergeSort(workSpace, 0, self.nElems-1)\n\n def recMergeSort(self,workSpace, lowerBound,upperBound):\n if(lowerBound == upperBound): # if range is 1,\n return\n else:\n mid = (lowerBound+upperBound) / 2\n self.recMergeSort(workSpace, lowerBound, mid)\n self.recMergeSort(workSpace, mid+1, upperBound)\n self.merge(workSpace, lowerBound, mid+1, upperBound)\n\n def merge(self,workSpace,lowPtr,highPtr,upperBound):\n j = 0\n lowerBound = lowPtr\n mid = highPtr-1\n n = upperBound-lowerBound+1\n while(lowPtr <= mid and highPtr <= upperBound):\n if( self.theArray[lowPtr] < self.theArray[highPtr] ):\n workSpace[j] = self.theArray[lowPtr]\n j += 1\n lowPtr += 1\n else:\n workSpace[j] = self.theArray[highPtr]\n j += 1\n highPtr += 1\n while(lowPtr <= mid):\n workSpace[j] = self.theArray[lowPtr]\n j += 1\n lowPtr += 1\n while(highPtr <= upperBound):\n workSpace[j] = self.theArray[highPtr]\n j += 1\n highPtr += 1\n for j in range(n):\n self.theArray[lowerBound+j] = workSpace[j]\n\nmaxSize = 100 # array size\narr = DArray(maxSize) # create the array\narr.insert(64) # insert items\narr.insert(21) \narr.insert(33) \narr.insert(70) \narr.insert(12) \narr.insert(85) \narr.insert(44) \narr.insert(3) \narr.insert(99) \narr.insert(0) \narr.insert(108) \narr.insert(36) \narr.display() # display items\narr.mergeSort() # merge sort the array\narr.display() # display items again",
+ "input": [
+ " \n",
+ "class DArray:\n",
+ " def __init__(self,m):\n",
+ " self.theArray = []\n",
+ " self.nElems = 0\n",
+ " \n",
+ " def insert(self,value):\n",
+ " self.theArray.append(value)\n",
+ " self.nElems += 1\n",
+ "\n",
+ " def display(self): # displays array contents\n",
+ " for j in range(self.nElems):\n",
+ " print self.theArray[j] ,\n",
+ " print ''\n",
+ "\n",
+ " def mergeSort(self):\n",
+ " workSpace = []\n",
+ " for i in range(self.nElems):\n",
+ " workSpace.append(0)\n",
+ " self.recMergeSort(workSpace, 0, self.nElems-1)\n",
+ "\n",
+ " def recMergeSort(self,workSpace, lowerBound,upperBound):\n",
+ " if(lowerBound == upperBound): # if range is 1,\n",
+ " return\n",
+ " else:\n",
+ " mid = (lowerBound+upperBound) / 2\n",
+ " self.recMergeSort(workSpace, lowerBound, mid)\n",
+ " self.recMergeSort(workSpace, mid+1, upperBound)\n",
+ " self.merge(workSpace, lowerBound, mid+1, upperBound)\n",
+ "\n",
+ " def merge(self,workSpace,lowPtr,highPtr,upperBound):\n",
+ " j = 0\n",
+ " lowerBound = lowPtr\n",
+ " mid = highPtr-1\n",
+ " n = upperBound-lowerBound+1\n",
+ " while(lowPtr <= mid and highPtr <= upperBound):\n",
+ " if( self.theArray[lowPtr] < self.theArray[highPtr] ):\n",
+ " workSpace[j] = self.theArray[lowPtr]\n",
+ " j += 1\n",
+ " lowPtr += 1\n",
+ " else:\n",
+ " workSpace[j] = self.theArray[highPtr]\n",
+ " j += 1\n",
+ " highPtr += 1\n",
+ " while(lowPtr <= mid):\n",
+ " workSpace[j] = self.theArray[lowPtr]\n",
+ " j += 1\n",
+ " lowPtr += 1\n",
+ " while(highPtr <= upperBound):\n",
+ " workSpace[j] = self.theArray[highPtr]\n",
+ " j += 1\n",
+ " highPtr += 1\n",
+ " for j in range(n):\n",
+ " self.theArray[lowerBound+j] = workSpace[j]\n",
+ "\n",
+ "maxSize = 100 # array size\n",
+ "arr = DArray(maxSize) # create the array\n",
+ "arr.insert(64) # insert items\n",
+ "arr.insert(21) \n",
+ "arr.insert(33) \n",
+ "arr.insert(70) \n",
+ "arr.insert(12) \n",
+ "arr.insert(85) \n",
+ "arr.insert(44) \n",
+ "arr.insert(3) \n",
+ "arr.insert(99) \n",
+ "arr.insert(0) \n",
+ "arr.insert(108) \n",
+ "arr.insert(36) \n",
+ "arr.display() # display items\n",
+ "arr.mergeSort() # merge sort the array\n",
+ "arr.display() # display items again"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": "64 21 33 70 12 85 44 3 99 0 108 36 \n0 3 12 21 33 36 44 64 70 85 99 108 \n"
+ "text": [
+ "64 21 33 70 12 85 44 3 99 0 108 36 \n",
+ "0 3 12 21 33 36 44 64 70 85 99 108 \n"
+ ]
}
],
"prompt_number": 16
@@ -165,30 +451,120 @@
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.7 Page No :295"
+ "source": [
+ "Example 6.7 Page No :295"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nExample 6.7\nevaluates triangular numbers, stack replaces recursion\n'''\nclass Params: #parameters to save on stack\n def __init__(self,nn, ra):\n self.n=nn\n self.returnAddress=ra\n\nclass StackX:\n def __init__(self,s):\n self.maxSize = s\n self.stackArray = []\n self.top = -1\n\n def push(self,j):\n self.top += 1\n self.stackArray.append(j)\n \n def pop(self):\n p = self.stackArray[self.top]\n self.top -= 1\n self.stackArray.remove(p)\n return p\n \n def peek(self):\n return self.stackArray[self.top]\n\n def isEmpty(self):\n return (self.top == -1)\n\n def isFull(self):\n return (self.top == self.maxSize-1);\n\ntheNumber = 0\ntheAnswer = 0\ntheStack = None\ncodePart = 0\ntheseParams = None\ndef recTriangle():\n global theStack,codePart\n theStack = StackX(10000)\n codePart = 1\n while( step() == False): # call step() until it's true\n pass\n\ndef step():\n global theStack,codePart,theseParams,theAnswer,theNumber\n if codePart==1:\n # initial call\n theseParams = Params(theNumber, 6)\n theStack.push(theseParams);\n codePart = 2\n elif codePart==2:\n # method entry\n theseParams = theStack.peek()\n if(theseParams.n == 1):\n theAnswer = 1\n codePart = 5\n else:\n codePart = 3\n elif codePart==3:\n newParams = Params(theseParams.n - 1, 4)\n theStack.push(newParams)\n codePart = 2 # go enter method\n elif codePart==4:\n theseParams = theStack.peek()\n theAnswer = theAnswer + theseParams.n\n codePart = 5\n elif codePart==5: # method exit\n theseParams = theStack.peek()\n codePart = theseParams.returnAddress # (4 or 6)\n theStack.pop()\n elif codePart==6: # return point\n return True\n else:\n pass\n return False\n\nprint 'Enter a number: ' ,\ntheNumber = int(raw_input())\nrecTriangle()\nprint 'Triangle = ' ,theAnswer\n\n",
+ "input": [
+ " \n",
+ "class Params: #parameters to save on stack\n",
+ " def __init__(self,nn, ra):\n",
+ " self.n=nn\n",
+ " self.returnAddress=ra\n",
+ "\n",
+ "class StackX:\n",
+ " def __init__(self,s):\n",
+ " self.maxSize = s\n",
+ " self.stackArray = []\n",
+ " self.top = -1\n",
+ "\n",
+ " def push(self,j):\n",
+ " self.top += 1\n",
+ " self.stackArray.append(j)\n",
+ " \n",
+ " def pop(self):\n",
+ " p = self.stackArray[self.top]\n",
+ " self.top -= 1\n",
+ " self.stackArray.remove(p)\n",
+ " return p\n",
+ " \n",
+ " def peek(self):\n",
+ " return self.stackArray[self.top]\n",
+ "\n",
+ " def isEmpty(self):\n",
+ " return (self.top == -1)\n",
+ "\n",
+ " def isFull(self):\n",
+ " return (self.top == self.maxSize-1);\n",
+ "\n",
+ "theNumber = 0\n",
+ "theAnswer = 0\n",
+ "theStack = None\n",
+ "codePart = 0\n",
+ "theseParams = None\n",
+ "def recTriangle():\n",
+ " global theStack,codePart\n",
+ " theStack = StackX(10000)\n",
+ " codePart = 1\n",
+ " while( step() == False): # call step() until it's true\n",
+ " pass\n",
+ "\n",
+ "def step():\n",
+ " global theStack,codePart,theseParams,theAnswer,theNumber\n",
+ " if codePart==1:\n",
+ " # initial call\n",
+ " theseParams = Params(theNumber, 6)\n",
+ " theStack.push(theseParams);\n",
+ " codePart = 2\n",
+ " elif codePart==2:\n",
+ " # method entry\n",
+ " theseParams = theStack.peek()\n",
+ " if(theseParams.n == 1):\n",
+ " theAnswer = 1\n",
+ " codePart = 5\n",
+ " else:\n",
+ " codePart = 3\n",
+ " elif codePart==3:\n",
+ " newParams = Params(theseParams.n - 1, 4)\n",
+ " theStack.push(newParams)\n",
+ " codePart = 2 # go enter method\n",
+ " elif codePart==4:\n",
+ " theseParams = theStack.peek()\n",
+ " theAnswer = theAnswer + theseParams.n\n",
+ " codePart = 5\n",
+ " elif codePart==5: # method exit\n",
+ " theseParams = theStack.peek()\n",
+ " codePart = theseParams.returnAddress # (4 or 6)\n",
+ " theStack.pop()\n",
+ " elif codePart==6: # return point\n",
+ " return True\n",
+ " else:\n",
+ " pass\n",
+ " return False\n",
+ "\n",
+ "print 'Enter a number: ' ,\n",
+ "theNumber = int(raw_input())\n",
+ "recTriangle()\n",
+ "print 'Triangle = ' ,theAnswer\n",
+ "\n"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": "Enter a number: "
+ "text": [
+ "Enter a number: "
+ ]
},
{
"name": "stdout",
"output_type": "stream",
"stream": "stdout",
- "text": "100\n"
+ "text": [
+ "100\n"
+ ]
},
{
"output_type": "stream",
"stream": "stdout",
- "text": " Triangle = 5050\n"
+ "text": [
+ " Triangle = 5050\n"
+ ]
}
],
"prompt_number": 17
@@ -197,30 +573,89 @@
"cell_type": "heading",
"level": 3,
"metadata": {},
- "source": "Example 6.8 Page no : 301"
+ "source": [
+ "Example 6.8 Page no : 301"
+ ]
},
{
"cell_type": "code",
"collapsed": false,
- "input": "'''\nExample 6.8\nevaluates triangular numbers, stack replaces recursion\n'''\n\n\nclass StackX:\n def __init__(self,s):\n self.maxSize = s\n self.stackArray = []\n self.top = -1\n\n def push(self,j):\n self.top += 1\n self.stackArray.append(j)\n \n def pop(self):\n p = self.stackArray[self.top]\n self.top -= 1\n self.stackArray.remove(p)\n return p\n \n def peek(self):\n return self.stackArray[self.top]\n\n def isEmpty(self):\n return (self.top == -1)\n\n def isFull(self):\n return (self.top == self.maxSize-1);\ntheNumber = 0\ntheAnswer = 0\ntheStack = None\ntheseParams = None\n\ndef stackTriangle():\n global theNumber,theAnswer,theStack,theNumber\n theStack = StackX(10000)\n theAnswer = 0\n while(theNumber > 0): # until n is 1,\n theStack.push(theNumber) # push value\n theNumber -= 1 # decrement value\n\n while( not theStack.isEmpty() ): # until stack empty,\n newN = theStack.pop() # pop value,\n theAnswer += newN\n\nprint 'Enter a number: ' ,\ntheNumber = int(raw_input())\nstackTriangle()\nprint 'Triangle = ' ,theAnswer\n\n\n",
+ "input": [
+ " \n",
+ "\n",
+ "\n",
+ "class StackX:\n",
+ " def __init__(self,s):\n",
+ " self.maxSize = s\n",
+ " self.stackArray = []\n",
+ " self.top = -1\n",
+ "\n",
+ " def push(self,j):\n",
+ " self.top += 1\n",
+ " self.stackArray.append(j)\n",
+ " \n",
+ " def pop(self):\n",
+ " p = self.stackArray[self.top]\n",
+ " self.top -= 1\n",
+ " self.stackArray.remove(p)\n",
+ " return p\n",
+ " \n",
+ " def peek(self):\n",
+ " return self.stackArray[self.top]\n",
+ "\n",
+ " def isEmpty(self):\n",
+ " return (self.top == -1)\n",
+ "\n",
+ " def isFull(self):\n",
+ " return (self.top == self.maxSize-1);\n",
+ "theNumber = 0\n",
+ "theAnswer = 0\n",
+ "theStack = None\n",
+ "theseParams = None\n",
+ "\n",
+ "def stackTriangle():\n",
+ " global theNumber,theAnswer,theStack,theNumber\n",
+ " theStack = StackX(10000)\n",
+ " theAnswer = 0\n",
+ " while(theNumber > 0): # until n is 1,\n",
+ " theStack.push(theNumber) # push value\n",
+ " theNumber -= 1 # decrement value\n",
+ "\n",
+ " while( not theStack.isEmpty() ): # until stack empty,\n",
+ " newN = theStack.pop() # pop value,\n",
+ " theAnswer += newN\n",
+ "\n",
+ "print 'Enter a number: ' ,\n",
+ "theNumber = int(raw_input())\n",
+ "stackTriangle()\n",
+ "print 'Triangle = ' ,theAnswer\n",
+ "\n",
+ "\n"
+ ],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
- "text": "Enter a number: "
+ "text": [
+ "Enter a number: "
+ ]
},
{
"name": "stdout",
"output_type": "stream",
"stream": "stdout",
- "text": "50\n"
+ "text": [
+ "50\n"
+ ]
},
{
"output_type": "stream",
"stream": "stdout",
- "text": " Triangle = 1275\n"
+ "text": [
+ " Triangle = 1275\n"
+ ]
}
],
"prompt_number": 18
@@ -228,7 +663,7 @@
{
"cell_type": "code",
"collapsed": false,
- "input": "",
+ "input": [],
"language": "python",
"metadata": {},
"outputs": []