可以在 R 中的递归阶乘中使用的最大 n



我有一个递归阶乘

recursive.factorial <- function(x) {
if (x == 0)    return (1)
else           return (x * recursive.factorial(x-1))
}

只是好奇在我的递归.factorial v.s R 中的 build-int factorial() 函数中最大的 x 是什么? 有没有办法检查一下

计算机数值的位跨度似乎比"计算机内存"更有可能成为问题,我假设你的意思是RAM的地址空间。在 R(以及使用通常的 IEEE 标准的任何软件包)中无需近似即可表示的整数的最大值为 2^53 - 1。还有其他包(其中一些作为 R 包提供)可以支持任意精度的数字。?Recall函数是一种更稳定的递归方法,尽管它在 R 中没有优化。integer.max设置为可使用 2 个字节获得的精度:

2^32-1
[1] 4294967295

而最近引入的"长整数"在浮点"双精度"的尾数极限处最大。

> 2^53-1
[1] 9.007199e+15
> print( 2^53-1, digits=18)
[1] 9007199254740991

因此,一旦您获得大于该限制的值factorial(n),您只会得到一个近似值,而当您超过"双精度"数字的幂限制时,您将获得"Inf"。我的factorial版本似乎与您的版本具有相同的突破点:

> fact <- function(n)
+    if(n==0) { 1} else{ (n) *Recall(n-1)}
> fact (170)
[1] 7.257416e+306
> fact (171)
[1] Inf

这是计算阶乘的另一种思考方式:

> exp( sum(log(1:15)))
[1] 1.307674e+12
> factorial(15)
[1] 1.307674e+12

"斯特林近似"通常用于加快阶乘的计算速度。要获得更准确的值,可以安装gmpRmpfr包。

最新更新