下面以30秒跑,而我希望它是几乎瞬间。是否有一个问题,我的code?
X< - 斐波纳契(35); 斐波纳契< - 功能(SEQ){ 如果(SEQ == 1)返回(1); 如果(SEQ == 2)返回(2); 返回(斐波纳契(SEQ - 1)+斐波纳契(SEQ - 2)); }
解决方案
帕特里克·伯恩斯给出为r的例子地狱的一种方式做记忆化在研发与本地()
和<< -
。事实上,这是一个斐波纳契:
&斐波纳契LT; - 本地({
备忘录< - C(1,1,代表(NA,100))
F< - 函数(X){
如果(X == 0)返回(0)
如果(X℃,)返回(NA)的
如果(X>长度(备忘录))
停止('X'太大实行)
如果(!is.na(备忘录[X]))收益率(备忘录[X])
答&所述; - F(X-2)+ F(X-1)的
备忘录[X]<< - ANS
答
}
})
The following takes about 30 seconds to run whereas I would expect it to be nearly instant. Is there a problem with my code?
x <- fibonacci(35);
fibonacci <- function(seq) {
if (seq == 1) return(1);
if (seq == 2) return(2);
return (fibonacci(seq - 1) + fibonacci(seq - 2));
}
解决方案
Patrick Burns gives an example in R Inferno of one way to do memoization in R with local()
and <<-
. In fact, it's a fibonacci:
fibonacci <- local({
memo <- c(1, 1, rep(NA, 100))
f <- function(x) {
if(x == 0) return(0)
if(x < 0) return(NA)
if(x > length(memo))
stop("’x’ too big for implementation")
if(!is.na(memo[x])) return(memo[x])
ans <- f(x-2) + f(x-1)
memo[x] <<- ans
ans
}
})