#! /usr/bin/python3 # =================================================================== # plot a factorial vs squared growth curve # (compare a function's O(n!) and O(n**2) growth) # =================================================================== import math import user_interface as ui from graphics import * # ------------------------------------------------------------------- # ---- plot factorial values # ---- n = number to factorial # ---- s = n step for plot # ------------------------------------------------------------------- def PlotFactorialCurve(win,n,s): print(f"plot {n} factorial with a step of {s}") for x in range(1,n,s): y = math.factorial(x) print(f"factiorial {x} is {y}") wx = round(x*20) # scale the X coordinate wy = round(win.height - y) # invert Y coordinate # ---- stay in the graphics window if wx < 0 or wx >= win.width or wy < 0 or wy >= win.height: break c = Circle(Point(wx,wy),4) c.setFill('black') c.draw(win) return # ------------------------------------------------------------------- # ---- plot squared values # ---- n = number to square # ---- s = n step for plot # ------------------------------------------------------------------- def PlotSquaredCurve(win,n,s): print(f"plot {n} squared with a step of {s}") for x in range(1,n,s): y = x**2 print(f"square of {x} is {y}") wx = round(x*20) # scale (spread out) the X coordinate wy = round(win.height - y) # invert Y coordinate (go up not down) # ---- stay in the graphics window if wx < 0 or wx >= win.width or wy < 0 or wy >= win.height: break c = Circle(Point(wx,wy),4) c.setFill('red') c.draw(win) return # ------------------------------------------------------------------- # ---- main # ------------------------------------------------------------------- if __name__ == '__main__': n = 200 win = GraphWin("Factorial vs Squared", 801, 801) win.setBackground("white") # ---- plot factorial growth PlotFactorialCurve(win,n,1) # ---- plot n**2 PlotSquaredCurve(win,n,1) ui.pause() win.close()