(我会在一秒钟内查看这个内容,但我希望将答案发布在SO上,以便谷歌找到它并且下一个人不必翻阅source。 )
众所周知,递归函数在多次调用时会很慢。对此的一个解决方案是将先前的答案写入内存,以便在重新计算的成本低于写入和回读的成本时重复使用它们。
R factorial
拨打R&#39 gamma
,gamma
拨打R .Primitive
。是原始的备忘录吗?
答案 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发行版进行了如此多的调用?