(我马上就去查一下,但我想把答案贴在上面,这样谷歌就可以找到它,这样下一个人就不用翻source了。)
众所周知,当递归函数多次调用自己时,速度会很慢。一种解决方案是将以前的答案写入内存,以便在重新计算的成本低于写回和读回的成本时重用它们。
R的factorial调用R的gamma,gamma调用R的.Primitive。这是原始的记忆吗?
发布于 2015-09-04 01:12:54
当然不是,因为如果是这样的话,我们就会知道R有本机内存支持。但事实并非如此。因此...
然而,正如我在Rcpp一书的介绍章节中所讨论的那样,这样做的成本很低,因为我们的"Hello,world!“真的是斐波那契数列;-)
发布于 2015-09-04 01:26:31
我不这样认为。查看https://github.com/wch/r-source/blob/trunk/src/nmath/gamma.c (假设这就是.Primitive("gamma")找到的内容),看起来gammafn使用切比雪夫多项式来查找浮点绝对值< 10的输入的gamma,并返回
exp((y - 0.5) * log(y) - y + M_LN_SQRT_2PI +
((2*y == (int)2*y)? stirlerr(y) : lgammacor(y)))对于更大的输入。我可能没有正确理解这一点,但我没有看到任何回忆录。
Ben Bolker指出,这也不是递归的。我要补充的是,大数开关使用的是Stirling近似。这一切都是从一个著名实验室编写的FORTRAN代码继承而来的。我想我应该提出一个后续问题,为什么在统计应用中,伽马函数的这些近似比更精确的版本更可取。也许是因为MCMC为了共同的前科而对beta发行版进行了如此多的调用?
https://stackoverflow.com/questions/32381663
复制相似问题