给定系列的总和

时间:2012-05-11 20:44:45

标签: python

我正在尝试使用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练习。

5 个答案:

答案 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