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()