Python3中如何不预设范围执行while循环 用莱布尼茨级数求π近似值
问题分析
你需要实现的是用莱布尼茨级数计算π的近似值,原代码的设计存在多个问题导致无法正常得到结果,也不需要预先设置迭代上限n。
原代码核心问题
- 内存使用不合理:用列表存储所有历史项和计算结果完全没有必要,不仅需要提前设置n的上限,迭代次数大时还会占用极高内存,甚至触发内存不足问题。
- 循环逻辑错误:while循环嵌套for循环的结构会导致如果预设的n不够大,for循环跑完还没达到精度要求时,while会重新触发for循环从头开始计算,永远无法满足退出条件,形成死循环。
- 性能极低:每次迭代都调用
sum(a)计算全列表的和,时间复杂度达到O(n²),迭代量稍大就会完全卡住。
优化实现方案
不需要预设迭代次数上限,仅保留必要的中间变量做无限迭代即可,空间复杂度为O(1),没有内存溢出风险:
def calculate_pi(): sum_series = 0.0 # 当前项的符号,初始为正 sign = 1 # 当前项的分母,初始为1 denominator = 1 # 上一次迭代计算的π值 prev_pi = 0.0 # 精度要求 precision = 0.00000000005 while True: sum_series += sign * (1 / denominator) current_pi = 4 * sum_series # 满足精度要求直接返回结果 if abs(current_pi - prev_pi) <= precision: return current_pi # 更新下一次迭代的参数 prev_pi = current_pi sign *= -1 denominator += 2
补充说明
莱布尼茨级数的收敛速度极慢,要达到你要求的1e-11级别的精度,大约需要400亿次迭代,纯Python执行需要非常长的时间。如果只是验证代码逻辑,可以先把precision调大到1e-5,此时仅需要十万次左右的迭代,几秒内就能得到结果。
内容的提问来源于stack exchange,提问作者the_sentinel
相关产品推荐
相关产品推荐

