[R] how to store recursive results

Thomas Lumley tlumley at u.washington.edu
Fri Sep 22 18:19:34 CEST 2006

```On Fri, 22 Sep 2006, X.H Chen wrote:

> Hi Gabor,
>
> Thanks for pointing out this for me. However, what I try to get is how to
> construct such form a function f that
>
> ret<-f(...),
>
> where ret contains the each recursive result from f, and meantime f consists
> of no <<- operator. Do you have any idea how to implemet this. Thanks a lot
>

It depends on the situation. You can always pass the results back in a
list or vector, eg

cumfactorial<-function(n){
if (n==0)
1
else c(1, n*cumfactorial(n-1))
}

If you want to get the results out then you have to either accumulate and
return them like this or use <<-, since return() and <<- are the only ways
to get results out of a function.  As long as you don't use <<- to assign
to variables outside the function it is a perfectly reasonable thing to do

If you were doing something like a Fibonacci sequence then assigning would
be preferable

fib<-function(n){
memo<-new.env(hash=TRUE)
fibrec<-function(m){
if (m<=2) return(1)
vm<-paste("v",m,sep="")
if(exists(vm,envir=memo,inherits=FALSE))
return(get(vm,envir=memo,inherits=FALSE))
rval<-fibrec(m-1)+fibrec(m-2)
assign(vm,rval,envir=memo)
rval
}
fibrec(n)
sapply(ls(envir=memo),get, envir=memo)
}

since the memoization converts the algorithm from exponential time to
linear time.

```