R:递归太慢了

时间:2015-10-31 14:57:59

标签: r performance recursion sequence

我有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
+ }
+ })

1 个答案:

答案 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