yas*_*sar 1 python doctest tail-recursion
我正在检查doctest并将factorial示例复制到我的编辑器中.由于使用递归感觉更多的函数式编程,我觉得像这样更改示例;
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
Run Code Online (Sandbox Code Playgroud)
在此更改后,其中一个测试失败;
Failed example:
factorial(30.0)
Expected:
265252859812191058636308480000000L
Got:
2.6525285981219103e+32
Run Code Online (Sandbox Code Playgroud)
这种差异的原因是什么?
尝试运行factorial(30)而不是factorial(30.0).浮点加法不像整数加法那样精确,所以你会在一段时间后开始看到错误.
考虑:
>>> 1e20 + 1 == 1e20 #True
Run Code Online (Sandbox Code Playgroud)
这是因为您没有足够的精度(位)来唯一地存储这两个数字.(一个典型的python float有64位意味着你有2**64个独特的组合 - 在某些1.84e19选项附近.但是,python float的最大大小sys.float_info.max是1.8e308大多数系统的大小,所以没有办法存储每个整数值唯一的 - 特别是当你认为浮点数可以比整数值更多时)
就个人而言,我只是将n的值转换为你的阶乘函数中的一个整数,因为阶乘只是为整数定义 - 可能会检查以确定那个abs(int(n) - n) < 1e-5或那个效果.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |