我必须编写一个函数,使用以下系列的前10个项计算并返回角度的余弦:cosx = 1 - (x**2)/2! + (x**4)/4! - (x**6)/6!....
我不能使用阶乘函数,但我可以使用这样的事实:如果前一个分母是n!
,则当前分母将是n!(n+1)(n+2)
。我正在尝试使用累加器循环,但我很难处理它从正面到负面交替并且还有分母的问题。
这就是我到目前为止所拥有的。有关分母和累加器循环的任何帮助吗?
def factorial(x):
if(x == 0):
return 1
return x * factorial(x-1)
def cosine(angle):
cosx = 1
sign = -1
for i in range(2, 20, 2):
cosx = cosx + (sign*(angle**i))/factorial(i)
sign = -sign
return cosx
答案 0 :(得分:2)
也许是这样的:
#! /usr/bin/python3.2
def cos (a):
d = 1
c = 1
for i in range (2, 20, 2):
d *= i * (i - 1)
sign = -1 if i % 4 else 1
print ('adding {} * a ** {} / {}'.format (sign, i, d) )
c += sign * a ** i / d
print ('cosine is now {}'.format (c) )
return c
cos (1.0)
基本上d
(如分母)是你的累加器。
答案 1 :(得分:2)
注意:如果您使用 Python2.x ,则应使用
from __future__ import division
作为文件的第一行
一种方法是像这样替换标志
def cos(angle):
sign = -1
cosx = 1
for i in range(2,20,2):
cosx += sign*(x**i)/(i)
sign = -sign
你仍然需要使阶乘部分正确
这是一个更简单的版本,它根据前一个术语计算每个术语。
def cos(x):
res = 0
term = 1
for i in range(1, 20, 2):
res += term
term *= -x * x/ i /(i + 1)
return res
答案 2 :(得分:1)
为什么不为factorial做一个函数? (我为重复添加了一个可选参数):
修改强>
根据评论,这里是一个“学习”因子函数,它将确保不重新计算任何值(授予此值只能达到199!我假设使用cos的重复次数绝不会超过99次函数,因为它可能会在90左右抛出溢出错误):
facts = [0]*200
facts[0] = 1
def factorial(x):
if(facts[x] != 0): return facts[x]
return x * factorial(x-1)
def cos(x, reps=10):
final_val = 1
neg = -1
for n in range(2, reps*2, 2):
final_val += neg*(x**n)/factorial(n)
neg *= -1
return final_val
print cos(3.14/2)
答案 3 :(得分:0)
对于计算系列,请使用列表推导的强大功能。
In [1]: a = range(1,11)
In [2]: a
Out[2]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
mul
函数将给出列表的元素乘以:
In [3]: def mul(r):
...: rv = 1
...: for j in r:
...: rv *= j
...: return rv
...:
现在您可以生成因子:
In [7]: b = [mul(a[:i]) for i in a]
In [8]: b
Out[8]: [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
从列表中选择正确的元素;
In [10]: a[1::2]
Out[10]: [2, 4, 6, 8, 10]
In [11]: b[1::2]
Out[11]: [2, 24, 720, 40320, 3628800]
生成加号和减号:
In [12]: [(-1)**k for k in a[:5]]
Out[12]: [-1, 1, -1, 1, -1]
结合所有元素;
In [14]: data = zip(a[1::2], b[1::2], [(-1)**k for k in a[:5]])
然后对某个x
;
In [21]: x = 12
In [22]: sum([s*x**t/float(b) for t, b, s in data])
Out[22]: -9753.737142857142