R的“base :: factorial”是否被记忆了?

时间:2015-09-03 17:08:20

标签: r recursion

(我会在一秒钟内查看这个内容,但我希望将答案发布在SO上,以便谷歌找到它并且下一个人不必翻阅source。 )

众所周知,递归函数在多次调用时会很慢。对此的一个解决方案是将先前的答案写入内存,以便在重新计算的成本低于写入和回读的成本时重复使用它们。

R factorial拨打R&#39 gammagamma拨打R .Primitive。是原始的备忘录吗?

2 个答案:

答案 0 :(得分:5)

当然不是因为如果我们知道R有原生记忆支持。它没有。因此...

事实上我做的很便宜,因为我在Rcpp书的介绍章节中讨论过,因为我们的" Hello,world!" 确实是Fibonacci序列; - )

答案 1 :(得分:4)

我不这么认为。查看https://github.com/wch/r-source/blob/trunk/src/nmath/gamma.c(假设.Primitive("gamma")找到了什么),看起来gammafn使用Chebyshev多项式来查找具有浮点绝对值的输入的gamma价值< 10,并返回

exp((y - 0.5) * log(y) - y + M_LN_SQRT_2PI +
            ((2*y == (int)2*y)? stirlerr(y) : lgammacor(y)))

用于更大的输入。我可能没有正确理解这一点,但我没有看到任何记忆。

Ben Bolker指出这也不是递归的。我应该补充说,大数字开关使用的是斯特林的近似值。这一切都是从着名实验室编写的FORTRAN代码继承而来的。我想我应该提出一个后续问题,为什么这些伽马函数的近似值比统计应用中更准确的版本更可取。也许是因为MCMC对普通先验的beta发行版进行了如此多的调用?