计算一系列的总和?

时间:2016-09-18 16:44:29

标签: python python-3.x

这是我的任务,对于我的生活,我似乎无法想办法。这是我到目前为止的代码:

sum = 0
k = 1
while k <= 0.0001:
     if k % 2 == 1:
       sum = sum + 1.0/k
     else:
      sum = sum - 1.0/k
 k = k + 1
 print()

这是我的任务:

  

创建一个名为sumseries.py的python程序,它执行以下操作:   将评论放在程序的顶部,并附上您的姓名,日期和   该程序的功能描述。

     

编写一个程序来计算和显示系列的总和:

     

1 - 1/2 + 1/3 - 1/4 + ......

     

直到达到小于0.0001的期限。

10,000次迭代的答案似乎是0.6930971830599583

我以1,000,000,000(十亿)次迭代运行该程序,并提出了一些0.6931471810606472。我需要创建一个循环来可编程地创建该系列。

5 个答案:

答案 0 :(得分:5)

实际上,你可以写得更短:

Answer = sum(1.0 / k if k % 2 else -1.0 / k for k in range(1, 10001))

此代码的作用:

  • 最里面的部分是generator表达式,它可以“动态”计算一系列元素
      如果1.0 / k if k % 2 else -1.0 / k为奇数,则
    • 1.0 / k会产生k,否则会-1.0 / k a - ba + (-b)相同
    • for k in range(1, 10001)遍历范围从1(包含)到10001(不包括)的所有k
  • sum可以计算任何序列的总和(确切地说是任何iterable),无论是列表,元组还是生成器表达式

没有生成器表达式的相同内容:

Answer = 0
for k in range(1, 10001):
    if k % 2:
        Answer += 1.0 / k
    else:
        Answer -= 1.0 / k

    # or simply:
    # Answer += 1.0 / k if k % 2 else -1.0 / k

答案 1 :(得分:2)

你几乎就在那里,你需要做的就是替换

while k <= 0.0001:

使用:

 while term <= 0.0001:

术语自然是1 / k

答案 2 :(得分:0)

为了让老师高兴,你必须遵循问题的细节以及问题的精神。问题清楚地表明打印总和,而不是所有部分总和。你会通过提交一个不需要10000行垃圾的解决方案来激怒老师。

有些人建议预先计算10000的循环限制,但这不是所请求的算法。相反,一个是计算连续项(1,-1 / 2,1 / 3,-1 / 4,...),直到达到小于0.0001的项。

指出问题的原因是,最终会得到一个更普遍有用的程序,适用于广泛的术语公式。如果术语公式从(-1)**(k-1)/k更改为1/k1/k^2,则不会是一个错误的答案。

老师的措辞&#34;术语小于0.0001&#34;是不精确的,并假设一些数学知识。他们希望该项的大小(绝对值)小于0.0001。否则,正如有人指出的那样,迭代将在第二个项-1/2处停止。

所以,如果没有一个跳过一章的浮夸的迂腐解决方案,这个答案就不会是完整的。 ;)请注意,如果没有转换为float,以前的一些答案将无法在Python2.x中使用。

def term(k):
    return (-1)**(k - 1) / float(k)

err = 0.0001

def terms():
    k = 1
    t = term(k)
    while abs(t) >= err:
        yield t
        k += 1
        t = term(k)

print(sum(terms()))

答案 3 :(得分:0)

以下是您的老师正在寻找全额学分的答案 直到&lt; .0001表示while> = 0.0001这会对您的代码进行最少的修改,因此会对您所编写的内容进行更正

sum = 0
k = 1
while 1.0/k >= 0.0001:
     if k % 2 == 1:
       sum = sum + 1.0/k
     else:
       sum = sum - 1.0/k
     k = k + 1
print(sum)

答案 4 :(得分:0)

绝对最简单的方法如下 sum((-1)**(k) / k for k in range(1, 10001))