[R] Recursion is slow

William Dunlap wdunlap at tibco.com
Fri Sep 4 01:41:10 CEST 2009



Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com  

> -----Original Message-----
> From: r-help-bounces at r-project.org 
> [mailto:r-help-bounces at r-project.org] On Behalf Of Bryan Keller
> Sent: Thursday, September 03, 2009 2:11 PM
> To: r-help at r-project.org
> Subject: [R] Recursion is slow
> 
> The following recursion is about 120 times faster in C#.  I 
> know R is not known for its speed with recursions but I'm 
> wondering if anyone has a tip about how to speed things up in R.
> 
> #"T" is a vector and "m" is a number between 1 and sum(T)
> 
> A <- function(T,m) {
> lt <- length(T)
> 
> if (lt == 1) {
> 	if (0 <= m & m <= T[1]) {
> 		return(1)
> 		} else {
> 		return(0)
> 	}
> }
> R <- 0
> for (u in 0:T[lt]) {
> 	R <- (R+(A(T[1:(lt-1)],(m-u))))
> 	}
> return(R)
> }
> 

For starters, remove all repeated calculations from
the for loop.  Then vectorize the length(T)==2 case
to avoid a lot of calls to the scalar case.  Finally,
I noticed that the answer was independent of the
order of T and that putting it in reverse sorted order
was the faster order, so I did that.  I use default
values of arguments so you don't have to supply
derived values when you start but the recursions
don't have to recompute some things.

B <- function(T,m,lt=length(T), Tsorted = rev(sort(T))) {
   if (lt == 1L) {
      R <- as.integer(m <= Tsorted && 0L <= m)
   } else if (lt == 2L) {
      mu <- m - (0:Tsorted[2L])
      R <- sum(mu <= Tsorted[1L] & 0L <= mu)
   } else {
      R <- 0L
      lt1 <- lt-1L
      T1 <- Tsorted[1:lt1]
      for (mu in m-(0:Tsorted[lt])) {
         R <- R + B(unused, mu, lt1, T1)
      }
   }
   R
}

E.g.,

> system.time(A( c(20,40,35,21,31), 100))
   user  system elapsed 
  13.23    0.08   12.93 
> system.time(B( c(20,40,35,21,31), 100))
   user  system elapsed 
   0.35    0.00    0.33 
> A( c(20,40,35,21,31), 100)
[1] 193363
> B( c(20,40,35,21,31), 100)
[1] 193363

Bill Dunlap
TIBCO Software Inc - Spotfire Division
wdunlap tibco.com 

> -------------
> Bryan Keller, Doctoral Student/Project Assistant
> Educational Psychology - Quantitative Methods
> The University of Wisconsin - Madison
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide 
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
> 




More information about the R-help mailing list