pi的值可以近似为
=3+4/(2×3×4)−4/(4×5×6)+4/(6×7×8)−4/(8×9×10)+...
注意它是如何交替使用加号和减号的。
写一个函数,它接收一个整数n并返回pi的近似值,其中n项在上面的和中计算。
当𝑛=1时,它返回3。当𝑛=2时,返回结果3+42×3×4,依此类推。
它应该使用for循环。下面是我的代码:
def approximate_pi(n):
if (n==1):
approx_pi = 3
elif(n>1):
sign = 1
numb = 2
approx_pi = 3
counter = 0
for counter in range(1, n+1):
approx_pi = approx_pi + sign*(4/((numb)*(numb+1)*(numb+2)))
sign = sign*(-1)
numb += 2
counter +=1
print(approx_pi)
approximate_pi(2)
字符串
这给了我3.145238095238095,这和我在n =2时应该得到的3.16666667值不一样。为什么?为什么?
2条答案
按热度按时间vfwfrxfs1#
循环次数太多了,因为
range(1,n+1)
将迭代n
次,但是你已经包含了第一项(3),所以你只需要n-1
附加项。请注意,您不需要为
n==1
设置例外,如果范围为空,循环将根本不会迭代。考虑到这一点,再加上一点代数,函数可以简化为:
字符串
这里,符号是使用数学技巧来计算的,该技巧利用负数的奇/偶幂的行为。偶数次幂为1,奇数次幂为1。使用这个,
(-1)**i
产生附加项的交替符号。由于我们使用的是从1开始的i
值,因此我们将获得每个项的反符号,但这很容易通过从3中减去总和而不是相加来处理。分子(4)通过除以
i
而不是(2*i)
而减少为2,然后在和之外分解。cl25kdpy2#
你有太多的循环。当你调用
approximate_pi(2)
时,你会得到三次计算的结果。第一个值在循环外部设置为值3
。下一个值是3+4/(2*3*4)
,第三个值是3+4/(2*3*4)-4/(4*5*6)
。range(1, n+1)
应为range(1, n)
。现在你甚至不需要
n == 1
的特殊情况了。字符串
这将给您提供结果:
型
我将
counter
变量重命名为_
,因为它现在没有使用。如果你觉得计数器变量应该用于某些东西,那么你可以从它计算符号。;)
型
当然,您可以对
number
采取类似的方法。这会给予你这样的东西:型