数学家Srinivasa Ramanujan发现了一个有限的系列 用于生成1 /π的数值近似值:
编写一个名为estimate_pi的函数,使用此公式进行计算 并返回π的估计值。它应该使用while循环来计算 直到最后一个期限小于1e-15的总和条款 (这是10 ** - 15的Python表示法)。你可以查看结果 将它与math.pi进行比较。
虽然我的解决方案和正确的答案(我在互联网上找到)在逻辑上都是相似的,但我不明白为什么我的阶乘函数对这个问题不能正常工作。 (当我在pi的计算中使用它时,它会陷入无限循环。)当我单独检查我的阶乘函数时,它可以正常工作,但只是对于这个问题,似乎我必须遵循不同的结构。
我的代码:
import math
def fact(n):
if n == 0:
return 1
else:
return (n * fact(n - 1))
k = 0
result = 0
while True:
result = result + ( ( fact(4*k)*(1103 + 26390*k)) / ((fact(k)**4)
* (396 ** (4*k))) )
if abs(result) < 1e-15:
break
k = k + 1
print ("result = ", (2 * math.sqrt(2) / 9801) * result)
print("pi = ",math.pi)
正确的一个:
import math
def fact(n):
if n == 0:
return 1
else:
recurse = fact(n-1)
result = n * recurse
return result
k = 0
result = 0
while True:
result = result + ( ( fact(4*k)*(1103 + 26390*k)) / ((fact(k)**4)
* (396 ** (4*k))) )
if abs(result) < 1e-15:
break
k = k + 1
print ("result = ", (2 * math.sqrt(2) / 9801) * result)
print("pi = ",math.pi)
答案 0 :(得分:1)
你的阶乘功能很好。我检查了n
的所有值,最高为100,这远远超过了此问题所需的值。 (它可以提高效率,但这是一个不同的问题。)
你的问题与正确的答案(你在互联网上找到的)#34相同 - 那个所谓的&#34;正确的&#34;代码完全不正确。您可以在this web page找到实际正确的代码,这是 Think Python,第2版一书的作者的正式答案。
问题陈述说&#34;计算求和项,直到最后一项小于1e-15&#34;。但是,您实际上从未测试术语 - 而是测试部分和,即术语加上前一部分和。换句话说,在你的表达中
result = result + ( ( fact(4*k)*(1103 + 26390*k))
/ ((fact(k)**4) * (396 ** (4*k))) )
result
是部分和,而术语是删除变量result
时的右侧。你永远不会将这个术语存储在任你检查增长的部分和result
,永远不会变小,所以你有一个无限循环。
检查我链接的代码,以获得测试每个术语的正确答案。您的代码和官方答案之间还存在一些其他差异。你应该花一些时间来发现和理解差异。首先,你从未做过#34;编写一个名为estimate_pi&#34;的函数。