我有R运行功能:
f <- function (n) {
if ( n == 1) return (0)
if ( n == 2) return (1)
else return ( f(n-1) + f(n-2))
}
f(50)需要很长时间才能计算出来。 f(35)大约需要30秒。有没有办法让它在R中更快?
编辑。感谢帮助!我用过这个,它立即给了我f(50)。
> f <- local({
+ memo <- c(1, 1, rep(NA,100))
+ f <- function(x) {
+ if(x == 1) return(0)
+ if(x == 2) return(1)
+ if(x > length(memo))
+ stop("’x’ too big for implementation")
+ if(!is.na(memo[x])) return(memo[x])
+ ans <- f(x-1) + f(x-2)
+ memo[x] <<- ans
+ ans
+ }
+ })
答案 0 :(得分:1)
这是一个可以通过tail-recursion
解决的递归函数的注释问题。不幸的是,似乎是R does not support tail call optimization
。幸运的是,你总是可以使用迭代解决方案,你应该相当快,因为它不需要分配堆栈帧:
fIter <- function(n) {
if ( n < 2 )
n
else {
f <- c(0, 1)
for (i in 2:n) {
t <- f[2]
f[2] <- sum(f)
f[1] <- t
}
f[2]
}
}
fIter(100)'
此程序在ideone
上运行约0.45秒。我个人不认识R,程序来源:http://rosettacode.org/wiki/Fibonacci_numbers#R