good enough to know that "most of the timethe air traffic control system warns of impending collisions before they occur let' look at the worst-case running time of an iterative implementation of the factorial function def fact( )"""assumes is natural number returns !""answer while answer * - return answer the number of steps required to run this program is something like ( for the initial assignment statement and one for the return (counting step for the test in the while steps for the first assignment statement in the while loop and steps for the second assignment statement in the loopsofor exampleif is the function will execute roughly steps it should be immediately obvious that as gets largeworrying about the difference between and + is kind of silly for this reasonwe typically ignore additive constants when reasoning about running time multiplicative constants are more problematical should we care whether the computation takes steps or stepsmultiplicative factors can be important whether search engine takes half second or seconds to service query can be the difference between whether people use that search engine or go to competitor on the other handwhen one is comparing two different algorithmsit is often the case that even multiplicative constants are irrelevant recall that in we looked at two algorithmsexhaustive enumeration and bisection searchfor finding an approximation to the square root of floating point number functions based on each of these algorithms are shown in figure and figure def squarerootexhaustive(xepsilon)"""assumes and epsilon are positive floats epsilon returns such that * is within epsilon of ""step epsilon** ans while abs(ans** >epsilon and ans*ans <xans +step if ans*ans xraise valueerror return ans figure using exhaustive enumeration to approximate square root