编程语言
首页 > 编程语言> > Python – Memoization和Collat​​z序列

Python – Memoization和Collat​​z序列

作者:互联网

当我努力做Problem 14 in Project Euler时,我发现我可以使用一个叫memoization的东西来加速我的进程(我让它运行了15分钟,它仍然没有回复).问题是,我该如何实现它?我试过,但是我得到了一个keyerror(返回的值无效).这让我很烦,因为我很肯定我可以对此应用memoization并加快速度.

lookup = {}

def countTerms(n):
   arg = n
   count = 1
   while n is not 1:
      count += 1
      if not n%2:
         n /= 2
      else:
         n = (n*3 + 1)
      if n not in lookup:
         lookup[n] = count

   return lookup[n], arg

print max(countTerms(i) for i in range(500001, 1000000, 2)) 

谢谢.

解决方法:

还有一种很好的递归方式,它可能比poorsod的解决方案慢,但它更像你的初始代码,所以你可能更容易理解.

lookup = {}

def countTerms(n):
   if n not in lookup:
      if n == 1:
         lookup[n] = 1
      elif not n % 2:
         lookup[n] = countTerms(n / 2)[0] + 1
      else:
         lookup[n] = countTerms(n*3 + 1)[0] + 1

   return lookup[n], n

print max(countTerms(i) for i in range(500001, 1000000, 2))

标签:python,math,memoization
来源: https://codeday.me/bug/20190520/1143048.html