算法精粹:经典计算机科学问题的Python实现
上QQ阅读APP看书,第一时间看更新

数学意义重大的π(3.14159…)用很多公式都可以推导出来,其中最简单的公式之一就是莱布尼茨公式。它断定以下无穷级数的收敛值等于π:

π = 4/1 − 4/3 + 4/5 − 4/7 + 4/9 − 4/11…

请注意,以上无穷级数的分子保持为4,而分母则每次递增2,并且对每一项的操作是加法和减法交替出现。

将上述公式的每一项转换为函数中的变量,就能直接对该无穷级数进行建模。分子可以是常数4。分母可以是从1开始并以2递增的变量。至于加法或减法操作,可以表示为−1或1。代码清单1-19中,用变量pi在for循环过程中保存各级数之和。

代码清单1-19 calculating_pi.py

def calculate_pi(n_terms: int) -> float:
    numerator: float = 4.0
    denominator: float = 1.0
    operation: float = 1.0
    pi: float = 0.0
for _ in range(n_terms):
        pi += operation * (numerator / denominator)
        denominator += 2.0
        operation *= -1.0
return pi
if __name__ == "__main__":
    print(calculate_pi(1000000))

提示 在大多数平台中,Python的float类型是64位的浮点数(或C语言中的double类型)。

在建模或仿真某个有趣的概念时,公式和程序代码之间作生搬硬套式的直接转换是一种简单而高效的方案,以上函数就给出了很好的示例。直接转换是一种有用的工具,但必须时刻牢记它不一定是最有效的解决方案。其实,π的莱布尼茨公式可以用更加高效或紧凑的代码来实现。

注意 无穷级数的项数越多(调用calculate_pi()时给出的n_terms的值越大),π的最终计算结果就会越精确。