Python 练习册:练习 69 - 近似圆周率

The Python Workbook: Exercise 69 - Approximate pi

我是 Python 的新手,目前正在学习 Ben Stephenson 的 Python 练习册。我被练习 69 困住了,我的 pi 值在发散……有人能帮忙吗?我的代码有什么错误吗?

我在这里也附上了练习题。 Exercise Question

#Exercise 69: Approximate pi

maxrun = 15
denominator1 = 2
denominator2 = 3
denominator3 = 4
fractionpos = (4/(denominator1*denominator2*denominator3))
denominatora = 4
denominatorb = 5
denominatorc = 6
fractionneg = -4/(denominatora*denominatorb*denominatorc)

pi = 3
count = 1

while maxrun != 0:
    if count %2 != 0:   #odd runs are positive
        pi = pi+fractionpos
        print('Approximation',count,'pi value is',pi)
        count = count+1
        denominator1 = denominator1+4
        denominator2 = denominator2+4
        denominator3 = denominator3+4
        maxrun = maxrun-1
    elif count %2 ==0:    #even runs are negative
        pi = pi+fractionneg
        print('Approximation',count,'pi value',pi)
        count = count+1
        denominatora = denominator1+4
        denominatorb = denominator2+4
        denominatorc = denominator3+4
        maxrun = maxrun-1

这段代码有两个问题。

首先,当你计算分数的负数部分时,你应该将 4 加到分母 a,b,c 而不是 1,2,3。

其次,fractionposfractionneg只计算一次。您需要在每次迭代时重新计算它们。

此外,如果每个循环只添加两个,则可以去掉分母 a、b、c 并只对两者使用 1、2、3。如果你想要更多的挑战,你可以用一个分母变量而不是三个

由于您正在学习 Python 并且这是对您的练习,我建议您不要只是复制下面的代码,而是自己进行更改。玩得开心Python!

    if count %2 != 0:   #odd runs are positive
        pi = pi+(4/(denominator1*denominator2*denominator3))
        print('Approximation',count,'pi value is',pi)
        count = count+1
        denominator1 = denominator1+4
        denominator2 = denominator2+4
        denominator3 = denominator3+4
        maxrun = maxrun-1
    elif count %2 ==0:    #even runs are negative
        pi = pi+-4/(denominatora*denominatorb*denominatorc)
        print('Approximation',count,'pi value',pi)
        count = count+1
        denominatora = denominatora+4
        denominatorb = denominatora+4
        denominatorc = denominatora+4
        maxrun = maxrun-1

每次更新分母时,您也需要更新分数。 现在你的 fractionposfractioneg 没有改变,所以每次迭代,你都在添加原始条款。这就是你的 pi 近似值发散的原因。

我们可以通过在更新分母后更新 fractionposfractionneg 来修正这一点。

if count %2 != 0:   #odd runs are positive
    pi = pi+fractionpos
    print('Approximation',count,'pi value is',pi)
    count = count+1
    denominator1 = denominator1+4
    denominator2 = denominator2+4
    denominator3 = denominator3+4
    fractionpos = (4/(denominator1*denominator2*denominator3))
    maxrun = maxrun-1
else:    #even runs are negative
    pi = pi+fractionneg
    print('Approximation',count,'pi value',pi)
    count = count+1
    denominatora = denominator1+4
    denominatorb = denominator2+4
    denominatorc = denominator3+4
    fractionneg = -4/(denominatora*denominatorb*denominatorc)
    maxrun = maxrun-1

您的代码有两个问题:

pi = pi+fractionpos # This does not work because its value stays the same.
每次更改分母时,

fractionposfractionneg 都应更新。您可以通过在 while 循环中为它们重新分配一个值来实现。

在你的 elif 语句中,你应该将 4 添加到 denominatora 而不是 denominator1 和其他的。

 elif count %2 ==0:    #even runs are negative
        pi = pi+fractionneg
        print('Approximation',count,'pi value',pi)
        count = count+1
        denominatora = denominator1+4  # This goes wrong and the following as well
        denominatorb = denominator2+4
        denominatorc = denominator3+4
        maxrun = maxrun-1