Advertisement
asweigart

Untitled

Dec 30th, 2017
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. callStack = []
  2. callStack.append({'returnAddr': 'start', 'nthNumber': 10})
  3. returnValue = None
  4.  
  5. while len(callStack) != 0:
  6. nthNumber = callStack[-1]['nthNumber']
  7. returnAddr = callStack[-1]['returnAddr']
  8.  
  9. if returnAddr == '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) and fibonacci(%s).' % (nthNumber - 1, nthNumber - 2))
  22.  
  23. # "Calling" fibonacci(nthNumber - 1)
  24. callStack[-1]['returnAddr'] = 'after 1st recursive call'
  25. callStack.append({'returnAddr': 'start', 'nthNumber': nthNumber - 1})
  26. continue
  27. elif returnAddr == 'after 1st recursive call':
  28. # Continuation of the recursive case.
  29. callStack[-1]['result'] = returnValue
  30.  
  31. # "Calling" fibonacci(nthNumber - 2)
  32. callStack[-1]['returnAddr'] = 'after 2nd recursive call'
  33. callStack.append({'returnAddr': 'start', 'nthNumber': nthNumber - 2})
  34. continue
  35. elif returnAddr == 'after 2nd recursive call':
  36. callStack[-1]['result'] = callStack[-1]['result'] + returnValue
  37. print('Call to fibonacci(%s) returning %s.' % (nthNumber, callStack[-1]['result']))
  38.  
  39. # "Returns" the value in returnValue.
  40. returnValue = callStack[-1]['result']
  41. callStack.pop()
  42. continue
  43.  
  44. print(returnValue)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement