这是我在Euler项目中的第五个问题的解决方案。是否有任何方法来改进while循环条件而不是使用sum?
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发布于 2014-01-30 04:20:54
使用高阶函数而不是循环来编写程序总是更清楚,因为控制循环操作的所有无关变量都消失了。这里有一个与您的程序相同的计算程序,但是while和for循环消失了,变量table、result、pf和flag也消失了;变量x和y仍然存在,但仅限于辅助函数中的支持角色,而不是主要计算的一部分:
>>> from fractions import gcd
>>> def lcm(x,y): return x*y/gcd(x,y)
...
>>> print reduce(lcm,range(1,21))
232792560发布于 2014-01-30 03:51:11
用常量。当你想回去尝试不同的价值时,就更容易理解了。
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发布于 2014-01-30 04:18:28
您可以使用any()测试表,如下所示:
while any(n != 1 for n in table):
# do stuff我认为这比sum(table) > len(table)更清楚。
此外,正如@JoeClack建议的那样,使用常量。
完整的订正解决办法:
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,这是不需要的,但是让代码正常检查自己是个好主意。
我使用i和n作为索引和数字,而不是x和y。
我使用的是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/questions/21443784
复制相似问题