Skip to main content
 首页 » 编程设计

python之为什么递归改变结果

2025年05月04日19txw1958

我正在查看 doctest并将阶乘示例复制到我的编辑器中。因为使用递归感觉更像是函数式编程,所以我想把例子改成这样;

def factorial(n): 
    # ... omitted 
    if n+1 == n:  # catch a value like 1e300 
        raise OverflowError("n too large") 
 
    if n == 0: 
        return 1 
    else: 
        return factorial(n  - 1) * n 

此更改后,其中一个测试失败;

Failed example: 
    factorial(30.0) 
Expected: 
    265252859812191058636308480000000L 
Got: 
    2.6525285981219103e+32 

造成这种差异的原因是什么?

请您参考如下方法:

尝试使用 factorial(30) 运行而不是 factorial(30.0) .浮点加法与整数加法不完全相同,因此您会在一段时间后开始看到错误。

考虑:

>>> 1e20 + 1 == 1e20 #True 

这是因为您没有足够的精度(位)来唯一地存储这两个数字。 (一个典型的 python float 有 64 位,这意味着你有 2**64 个独特的组合——大约在 1.84e19 选项。但是,python float 的最大大小是 sys.float_info.max,在大多数系统上大约是 1.8e308,所以没有办法唯一地存储每个整数值——尤其是当你认为 float 可以容纳的不仅仅是整数值时)

就个人而言,我只是将 n 的值转换为阶乘函数中的整数,因为阶乘仅为整数定义——可能会检查以确保 abs(int(n) - n) < 1e-5或类似的东西。