首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Project Euler #5的Python代码

优化Project Euler #5的Python代码
EN

Stack Overflow用户
提问于 2014-01-29 22:12:13
回答 3查看 210关注 0票数 0

这是我在Euler项目中的第五个问题的解决方案。是否有任何方法来改进while循环条件而不是使用sum?

代码语言:javascript
复制
table = range(1,21)
result = 1
pf = 2
while sum(table) > len(table):
   flag = False
   for x,y in enumerate(table):
      if y % pf == 0:
         table[x] = y/pf 
         flag = True
   if flag:
      result *= pf
   else:
      pf += 1
print result
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-30 04:20:54

使用高阶函数而不是循环来编写程序总是更清楚,因为控制循环操作的所有无关变量都消失了。这里有一个与您的程序相同的计算程序,但是whilefor循环消失了,变量tableresultpfflag也消失了;变量xy仍然存在,但仅限于辅助函数中的支持角色,而不是主要计算的一部分:

代码语言:javascript
复制
>>> from fractions import gcd
>>> def lcm(x,y): return x*y/gcd(x,y)
...
>>> print reduce(lcm,range(1,21))
232792560
票数 3
EN

Stack Overflow用户

发布于 2014-01-30 03:51:11

用常量。当你想回去尝试不同的价值时,就更容易理解了。

代码语言:javascript
复制
MAX_DIVISOR = 20
table = range(1,MAX_DIVISOR + 1)
result = 1
pf = 2
while pf < MAX_DIVISOR + 1:
   flag = False
   for x,y in enumerate(table):
      if y % pf == 0:
     table[x] = y/pf 
     flag = True
   if flag:
      result *= pf
   else:
      pf += 1
print result
票数 1
EN

Stack Overflow用户

发布于 2014-01-30 04:18:28

您可以使用any()测试表,如下所示:

代码语言:javascript
复制
while any(n != 1 for n in table):
    # do stuff

我认为这比sum(table) > len(table)更清楚。

此外,正如@JoeClack建议的那样,使用常量。

完整的订正解决办法:

代码语言:javascript
复制
MAX_DIVISOR = 20
table = list(range(1, MAX_DIVISOR+1))

result = 1
pf = 2

while any(n != 1 for n in table):
    assert pf <= MAX_DIVISOR
    flag = False
    for i,n in enumerate(table):
        if n % pf == 0:
            table[i] = n//pf
            flag = True
    if flag:
        result *= pf
    else:
        pf += 1

print(result)

我添加了一个assert,以确保pf只具有合法的值;只要代码中没有bug,这是不需要的,但是让代码正常检查自己是个好主意。

我使用in作为索引和数字,而不是xy

我使用的是Python的整数除法操作符//,而不是/,所以代码在Python3.x上的工作方式与Python2.x相同。而且,我编写print语句的方式在Python3.x和Python2.x中同样适用。

根据PEP 8,我将压痕改为4个空格的台阶。

http://www.python.org/dev/peps/pep-0008/

注:我喜欢这个算法来解决这个问题。很优雅。是你发明的,是从书里得到的,还是怎么的?

编辑:实际上,项目欧拉问题5之前已经在StackOverflow上讨论过了。这里有一个答案,我刚才与上面的答案作了比较。这个几乎是上面那个的十倍。不过,有点棘手!

https://stackoverflow.com/a/8026041/166949

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21443784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档