#!/usr/bin/python
def Next(n):
if n % 2:
return 3 * n + 1
return n / 2
def FindLongestChainIndex(max_num):
# Cache results in a dictionary!
chain_length = {1:1}
max_chain = 0
max_length = 0
def GetChainLength(x):
if x not in chain_length:
chain_length[x] = 1 + GetChainLength(Next(x))
return chain_length[x]
for i in range(2, max_num + 1):
length = GetChainLength(i)
if length > max_length:
max_length = length
max_chain = i
return max_chain # , max_length, chain_length
def GetChain(x):
if x == 1:
return [1]
return [x] + GetChain(Next(x))
def GetLongestChain(x):
return GetChain(FindLongestChainIndex(x))
longest_chain = GetLongestChain(1000000)
print longest_chain[0], len(longest_chain)
Runs in 5 seconds on my pretty fast Mac.« Older Afraid to read the daily news? Need some broader p... | Tubular Bells, arranged for Co... Newer »
This thread has been archived and is closed to new comments
posted by mystyk at 3:37 AM on October 13, 2008