El mejor resultado que obtengo, teniendo en cuenta las optimizaciones de CalgaryCorpus, es sacando el cache de la función, de esta forma no se destruye en cada llamada.
Código Python:
Ver originalcache = {1:1}
def max_cycle(a, b):
def num(cache, n):
if n in cache: return cache[n]
if n % 2:
r = cache[n] = 1 + num(cache, 3 * n + 1)
else:
r = cache[n] = 1 + num(cache, n >> 1 )
return r
def sec(a, b):
maxim = 0
if a > b: a,b = b,a
lowlimit = max(a,b >> 1)
for i in xrange(lowlimit, b+1):
tr = num(cache, i)
if tr > maxim:
maxim = tr
return maxim
return sec(a, b)
Saludos.