Programming
Workshop

Spring 2010
course
navigation

apr 16

Worked on this together in class, re-working aaron's code and breaking into into general purpose functions and adding input.
""" Solve the collat .... your name | date """ def nextCollatz(x): """ Return next number in a collatz sequence. >>> nextCollatz(10) 5 >>> nextCollatz(11) 34 """ if x % 2 == 0: return x/2 else: return 3 * x + 1 def functionCounter(func, startX, endX): """ Return number of applications of func(x) it takes to get from startX to endX. For, example if func(func(func(startX))) == endX then this would return 3. >>> functionCounter(lambda x: x+1, 5, 10) 5 """ count = 0 x = startX while x != endX: count += 1 x = func(x) return count def getUpperLimit(): """ Return search limit, either from command line or user input. """ import sys if len(sys.argv) == 2: return int(sys.argv[1]) while True: try: x = raw_input('What is the upper limit? ') return int(x) except ValueError: print "That wasn't an integer. Try again." except (EOFError, KeyboardInterrupt): print "\nBye!" quit() def biggestCollatz(limit): """ Return (n, nIterations) such that n <= limit and nIterations is the largest collatz sequence. >>> biggestCollatz(10) (9, 19) """ MostCycles = 0 Number = 0 temp = 0 for x in range(1, limit + 1): temp = functionCounter(nextCollatz, x, 1) if temp > MostCycles: MostCycles = temp Number = x return (Number, MostCycles) def summarizeResults(n, nIter): print "Number: " + str(n) print "MostCycles: " + str(nIter) def main(): (n, nIter) = biggestCollatz(getUpperLimit()) summarizeResults(n, nIter) # print " Euler14v2 says : my name is " + __name__ if __name__ == '__main__': from doctest import testmod testmod() main()
http://cs.marlboro.edu/ courses/ spring2010/programming/ notes/ apr_16
last modified Friday April 16 2010 2:47 pm EDT