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

时间:2017-05-22 01:03:56

标签: r recursion factorial

我有一个递归因子

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

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

1 个答案:

答案 0 :(得分:2)

计算机数值的位跨度似乎比“计算机内存”更容易出现问题,我假设你的意思是RAM的地址空间。 R中可以无需近似表示的整数的最大值(以及使用通常的IEEE标准的任何软件包)是2 ^ 53 - 1.还有其他包(其中一些可用作R包)可以支持任意精度NUMERICS。 ?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个包。