4

I am trying to find the sum for series : 1 − 1 / 2 + 1 / 3 − 1 / 4 + · · · + 1 / 99 − 1 / 100 ** 2 with python.

My code is -

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

The output is 0.69807217931

I don't have the answer and just want to verify if I am doing it right.

This is not a homework question but just random Python practice.

4

5 回答 5

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)来处理它. 这就是为什么您应该作为程序员学习更多数学的原因:)

于 2012-05-11T20:50:46.357 回答
4

嗯,我相信

import math
print math.log(2)

会成功的。

于 2012-05-11T20:59:44.730 回答
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?

于 2012-05-11T20:50:00.500 回答
1

看看你是否做对了,最简单的方法是用一个更短的系列来尝试,你可以手动检查。例如,使用 range(1, 5) 并查看它是否给出了您期望的答案。

对于样式提示,您可以使用 xrange 代替 range。xrange 很好,因为它只是根据需要返回每个数字,而 range 创建所有数字的大列表。如果对 range(1, 1000000) 执行此操作,则会占用大量内存,而 xrange 不会。

我认为,您也可以只使用一个变量而不是两个变量。

于 2012-05-11T20:52:10.217 回答
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
于 2012-05-11T21:17:36.407 回答