练习7.3思考Python书

时间:2018-01-06 16:23:59

标签: python

  

数学家Srinivasa Ramanujan发现了一个有限的系列   用于生成1 /π的数值近似值:

     

enter image description here

     

编写一个名为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)

1 个答案:

答案 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;的函数。