我正在尝试使用python找到系列的总和:1 − 1 / 2 + 1 / 3 − 1 / 4 + · · · + 1 / 99 − 1 / 100 ** 2
。
我的代码是 -
psum = 0
nsum = 0
for k in range(1,100):
if k%2 == 0:
nsum += 1.0/k
else:
psum += 1.0/k
print psum - nsum - 1.0/100**2
输出为0.69807217931
我没有答案,只是想验证我是否正确行事。
这不是一个家庭作业问题,只是随机的Python练习。
答案 0 :(得分:5)
这很好,但为什么不只是使用一个“求和”变量(称之为total
,作为一种良好的做法,因为有一个内置的叫sum
,你不要我真的想隐藏),并在每一步实际上加减它?
或者(双关语!),实际上使用 sum
函数。 range
函数也可用于跳过其他所有数字。
>>> sum(1.0/k for k in range(1, 100, 2)) - sum(1.0/k for k in range(2, 100, 2)) - (1.0/100**2)
0.6980721793101952
或者,正如steveha所示,你可以使用逻辑来根据它是否可以被2整除来判断是否加上或减去数字,并用“加权”总和来处理它(加上1.0 / k或-1.0 / k作为适当的)。这就是为什么你应该学习更多的数学作为程序员:)
答案 1 :(得分:4)
嗯,我相信
import math
print math.log(2)
会做到这一点。
答案 2 :(得分:3)
sum(1.0/k if k % 2 else -1.0/k for k in xrange(1, 100)) - 1.0/100**2
上面的代码与您的代码完全相同,并得到相同的答案。
为什么系列使用1 / k从1到99,然后使用1 / k ** 2仅用于k == 100?
答案 3 :(得分:1)
看看你做得对的最简单的方法是尝试使用更短的系列,你可以手动检查。例如,使用范围(1,5)并查看它是否给出了您期望的答案。
对于样式提示,您可以使用xrange而不是range。 xrange很好,因为它只返回所需的每个数字,而range创建了一个包含所有数字的大列表。如果你为范围(1,1000000)执行此操作,则会占用大量内存,而xrange则不会。
我认为你也可以只用一个变量而不是两个变量。
答案 4 :(得分:0)
这是我的建议。 很少但更多LOC然后@steveha但更通用。
getx=lambda x:(1.0/x)*((-1)**((x%2)+1))
num=100
sum((getx(x) for x in xrange(1,num)))+getx(num)**2
0.688172179310195