Python 中圆周率的连分数

Continued fraction for pi in Python

我正在尝试使用连分数来近似圆周率。

我正在使用这个公式。

几个小时后,我到了这里。

for i in range(1,15,1):
    e = ((2*i - 1) ** 2)
    b = (e / (6 + ((2*(i+1) - 1) ** 2)))

    print(3+b)

`

但是我的输出不是很好...

您的方法不正确。如果您用一些示例值代替 i,您会注意到您完全忽略了除此分数的第 i 和第 i+1 部分以外的所有内容。您需要确保您的循环考虑到所有更高级别以及您正在计算的新级别。我认为编写解决方案的最简单方法是使用递归:

def inf_pi(its, ctr = 1):
    if its == 0:
        return 0
    else:
        x = ((2*ctr)-1)**2 / (6 + inf_pi(its - 1, ctr + 1))
        return  x + (3 if ctr == 1 else 0)

print(inf_pi(10))

如果您需要迭代方法,您必须考虑两件事 - 首先,您只能以有限的精度计算它,并且您需要用一些值替换未计算的余数。第二个问题是你试图从最外层分数计算这个,但你不知道“无限”分数的值是多少。如果你颠倒顺序,从最里面的分数开始,将超出所需精度的部分替换为常量后,你可以一直计算每一步的值,直到最外面的分数。

def it_pi(its):
    pi = 0
    for i in range(its, 0, -1):
        pi = (((2*i)-1)**2) / (6 + pi)
    return 3 + pi