P=lambda n: n %2 ==0 and n/2 or (3*n+1)
dic=dict()
dic[1]=1
i=2
Max=1000000
while i<=Max:
p=i
cnt=0
while p !=1:
if dic.has_key(p):
dic[i] =dic[p]+cnt
break
else :
p=P(p)
cnt +=1
else:
dic[i]=cnt
i +=1
ls=sorted(dic.items(),key=lambda d:d[1])
print ls[Max-1]
the result is 837799
思路:如果N没有计算过,那么循环,直到某个数p已经计算过,令dic[n]=dic[p]+cnt ; 如果p=1,将dic[n]=cnt