编写程序来计算系列术语的总和

时间:2018-03-24 00:50:40

标签: python

编写程序来计算系列术语的总和:4 - 8 + 12 - 16 + 20 - 24 + 28 - 32 + .... +/- n,其中n是输入。考虑到n总是有效的(哪个 意味着它遵循系列模式)。

n = int(input("Enter n: "))
sum = 0
for i in range(4,n+4,4):
    sum += i - (i+2)
print("The sum of %s first terms is: %s"%(n,sum))

似乎无法找到我已经解决的问题

4 个答案:

答案 0 :(得分:1)

首先,要知道你的系列总和有一个封闭的形式。

def series_sum(n):
    sign = 1 if n % 2 else -1
    value = (n - 1) // 2 * 4 + 4
    return sign * value

series_sum(1) # 4
series_sum(2) # -4
series_sum(3) # 8

但总的来说,无限系列是生成器的一个很好的用例。

def series():
    value = 0
    sign = -1
    while True:
        value += 4
        sign *= -1
        yield sign * value

s = series()

next(s) # 4
next(s) # -8
next(s) # 12

因此,为了获得总和,你可以做到这一点。

s = series()

def sum_series(n, s):
    return sum(next(s) for _ in range(n))

sum_series(5, s) # 12

评论中提出的一个有趣的问题也是,鉴于某些价值,我们如何才能恢复总和,直到系列中达到该值。发电机方法非常适合这类问题。

from itertools import takewhile

def sum_until(val):
    return sum(x for x in takewhile(lambda x: -val <= x <= val, series()))

sum_until(12) # 8

答案 1 :(得分:1)

明确的公式怎么样?

def sumSeries(n):
  if n / 4 % 2 == 0:
    return - n / 2
  else:
    return (n + 4) / 2

该系列没有做任何太有趣的事情,它只是每两步添加+4,并以偶数步骤翻转符号:

4               = 4
4 - 8           = -4
4 - 8 + 12      = 8
4 - 8 + 12 - 16 = -8
...

一些例子:

for n in range(4, 100, 4):
  print("%d -> %d" % (n, sumSeries(n)))

输出:

4 -> 4
8 -> -4
12 -> 8
16 -> -8
20 -> 12
24 -> -12
28 -> 16
32 -> -16
36 -> 20
40 -> -20
44 -> 24
48 -> -24
52 -> 28
56 -> -28
60 -> 32
64 -> -32

答案 2 :(得分:0)

Python可用于轻松计算数学序列和序列。

我们发现所有值的总和都计算到n

<强>鉴于

以下数学成分:

enter image description here

  1. generating functionA
  2. 示例alternating arithmetic sequenceB
  3. 求和方程(C
  4. 我们现在实施A验证的CB两种方法。

    <强>代码

    import itertools as it
    
    
    n = 8
    

    生成函数A

    seq = [(-1)**(i + 1)*(4 * i) for i in range(1, n + 1)]
    sum(seq)
    # -16
    

    求和方程,C

    def f(n):
        if n == 1:
            return 1
        elif n % 2 == 0:
            return -n // 2
        else:
            return (n + 1) // 2
    
    
    4*f(n)
    # -16
    

    <强>详情

    生成功能

    第一种方法简单地对由列表推导生成的算术序列求和。值的符号以(-1)**(i + 1)

    的形式交替出现
    seq
    # [4, -8, 12, -16, 20, -24, 28, -32]
    

    类似地,可以使用生成器表达式和itertools.count

    来创建无限序列
    inf_seq = ((-1)**(i + 1)*(4 * i) for i in it.count(1))
    sum(it.islice(inf_seq, n))
    # -16
    

    这里为一片n值返回总和。请注意,我们可以使用take itertools recipeitertools.accumulate来计算一些任意数量的求和,例如: 10个总和(另见itertools.takewhile)。

    def take(n, iterable):
        "Return first n items of the iterable as a list"
        return list(it.islice(iterable, n))
    
    
    inf_seq = ((-1)**(i + 1)*(4 * i) for i in it.count(1))
    list(take(10, it.accumulate(inf_seq)))
    # [4, -4, 8, -8, 12, -12, 16, -16, 20, -20]
    

    求和方程式

    第二种方法来自检验,其中模式由样品序列的输出确定:

     n       4n        f(n)       4f(n)
    ---     ----       ----       -----
      1        4         1    ->     4
      2       -8        -1    ->    -4
      3       12         2    ->     8
      4      -16        -2    ->    -8
      5       20         3    ->    12
      6      -24        -3    ->   -12
      7       28         4    ->    16
      8      -32        -4    ->   -16
      9       36         5    ->    20
     10      -40        -5    ->   -20
    

    对于任意最终值n,生成序列的值(4n)。当乘以某个未知函数f(n)时,会计算结果总和(4f(n))。我们通过推导序列值和预期总和之间的关系来确定f(n)的模式。一旦确定,我们直接实现一个计算我们所需总和的函数。

    <强>亮点

    • 可以从列表推导中生成数学序列。
    • 无限序列可以从生成器表达式中生成。
    • 可以使用缩减函数来计算数学序列/生成函数,例如, sum()operator.mul()等应用于序列。
    • 一般求和方程可以用简单的Python函数实现。

答案 3 :(得分:-1)

正如@John Coleman所指出的那样,sum += i - (i+2)产生的结果并不像你预期的那样。

以下是我的解决方案:

使用if else确定符号,然后总结。最后,把它放到另一个循环中来创建你想要的系列。

n = 9
print('N='+str(n), [sum([index*4 if index%2 else index*-4 for index in range(1, num+1)]) for num in range(1, n+1)])
n = 8
print('N='+str(n), [sum([index*4 if index%2 else index*-4 for index in range(1, num+1)]) for num in range(1, n+1)])

输出:

N=9 [4, -4, 8, -8, 12, -12, 16, -16, 20]
N=8 [4, -4, 8, -8, 12, -12, 16, -16]
[Finished in 0.178s]