编写程序来计算系列术语的总和: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))
似乎无法找到我已经解决的问题
答案 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
<强>鉴于强>
以下数学成分:
A
)B
)C
)我们现在实施A
验证的C
和B
两种方法。
<强>代码强>
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 recipe和itertools.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()
等应用于序列。答案 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]