Python实现无限连分数近似自然常数e的递归函数问题排查
修正无限连分数近似自然常数e的递归实现
你的递归逻辑完全误解了连分数的数学结构,导致计算结果错误。连分数的核心规则是每一层都是1/(当前展开项 + 内层连分数的结果),以下是修正后的实现方案:
问题分析
你当前的fractionalSum函数分支逻辑混乱,没有正确体现连分数的嵌套结构:
inside函数的设计偏离了连分数的计算逻辑- number分支的判断(如number=2、number=88的硬编码)只是临时 workaround,无法扩展到任意层数
正确递归实现
以下代码严格遵循连分数的数学定义,支持任意层数(只要不超过Python默认递归深度,50层完全满足需求):
from fractions import Fraction def continued_fraction(start, end, array): # 递归计算从start到end索引的连分数部分 if start == end: return Fraction(1, array[start]) # 核心逻辑:1/(当前项 + 内层连分数结果) return Fraction(1, array[start] + continued_fraction(start + 1, end, array)) # 生成e的连分数展开项:[1,2,1,1,4,1,1,6,...] expansion = [] it = 1 # 生成110项(与原代码保持一致) while len(expansion) < 110: expansion.extend([1, 2 * it, 1]) it += 1 expansion = expansion[:110] # 计算前50层的近似值(可替换为任意>50的数值) layer_count = 50 e_approx = 2 + continued_fraction(0, layer_count - 1, expansion) print(f"e的{layer_count}层连分数近似值:") print(e_approx) print("转为小数:", float(e_approx))
迭代版本(无递归深度限制)
如果需要支持超过1000层的极端场景,建议使用迭代实现(从最内层向外层计算):
from fractions import Fraction def continued_fraction_iter(end_idx, array): # 从最后一项开始反向计算 result = Fraction(1, array[end_idx]) for i in range(end_idx - 1, -1, -1): result = Fraction(1, array[i] + result) return result # 生成展开项(同上) expansion = [] it = 1 while len(expansion) < 110: expansion.extend([1, 2 * it, 1]) it += 1 expansion = expansion[:110] layer_count = 100 e_approx = 2 + continued_fraction_iter(layer_count - 1, expansion) print(f"e的{layer_count}层连分数近似值:") print(float(e_approx))
验证正确性
你之前硬编码的number=88对应5层连分数计算,用修正后的代码验证:
print(2 + continued_fraction(0, 4, expansion))
会得到与硬编码逻辑完全一致的正确结果。
内容的提问来源于stack exchange,提问作者Daniel T. McGuiness
相关产品推荐
相关产品推荐

