Advertisement
asweigart

fibonacciEmulateRecursion.py

Jan 13th, 2022
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. callStack = []
  2. callStack.append({'instrPtr': 'start', 'nthNumber': 10})
  3. returnValue = None
  4.  
  5. while len(callStack) > 0:
  6. nthNumber = callStack[-1]['nthNumber']
  7. instrPtr = callStack[-1]['instrPtr']
  8.  
  9. if instrPtr == 'start':
  10. print('fibonacci(%s) called.' % (nthNumber))
  11. if nthNumber == 1 or nthNumber == 2:
  12. # BASE CASE
  13. print('Call to fibonacci(%s) returning 1.' % (nthNumber))
  14.  
  15. # "Returns" the value in returnValue.
  16. returnValue = 1
  17. callStack.pop()
  18. continue
  19. else:
  20. # RECURSIVE CASE
  21. print('Calling fibonacci(%s) (nthNumber - 1).' % (nthNumber - 1))
  22.  
  23. # "Calling" fibonacci(nthNumber - 1)
  24. callStack[-1]['instrPtr'] = 'after 1st recursive call'
  25. callStack.append({'instrPtr': 'start', 'nthNumber': nthNumber - 1})
  26. continue
  27. elif instrPtr == 'after 1st recursive call':
  28. # Continuation of the recursive case.
  29. callStack[-1]['result'] = returnValue
  30. print('Calling fibonacci(%s) (nthNumber - 2).' % (nthNumber - 2))
  31.  
  32. # "Calling" fibonacci(nthNumber - 2)
  33. callStack[-1]['instrPtr'] = 'after 2nd recursive call'
  34. callStack.append({'instrPtr': 'start', 'nthNumber': nthNumber - 2})
  35. continue
  36. elif instrPtr == 'after 2nd recursive call':
  37. callStack[-1]['result'] = callStack[-1]['result'] + returnValue
  38. print('Call to fibonacci(%s) returning %s.' % (nthNumber, callStack[-1]['result']))
  39.  
  40. # "Returns" the value in returnValue.
  41. returnValue = callStack[-1]['result']
  42. callStack.pop()
  43. continue
  44.  
  45. print(returnValue)
  46.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement