dynamics of functions
On Thu, 5 Jun 2003, Tobias Verbeke wrote:
Dear Thomas,
What about the following function?
iterate<-function(f,n,x){
if(n==0) return(x)
y<-x
for(i in 1:n)y<-f(y)
y
}
iterate(sqrt,3,256)
Thank you very much, this certainly helps. I'm still curious, though, to know how to write the expression of my function immediately as the argument f. I can define it outside of the function
aap <- function(x) -x^3
and use it as argument
iterate(aap,3,256),
but I seem not to be clever enough to write a function that receives the following as input
iterate(-x^3,3,256)
That's because -x^3 isn't a function. It's an expression.
You want
iterate(function(x) -x^3, 3, 256)
This might also be a good time to point out that this problem is one where
storing past values helps a lot.
The function below returns a function that iterates for a particular f and
x. It stores its past results, so if you ask for the same n again you get
it immediately and if you ask for an n a little bigger than a past one it
only has to do the remaining steps
You would do something like
ff<-iterator(function(z) 4*z*(1-z), x=0.3)
and then ff(10) gives the tenth iterate or
sapply(10*(1:100),ff)
gives the tenth, 20th, 30th,.. 1000th iterate.
-thomas
iterator<-function(f,x){
memo<-new.env()
function(n){
if (n==1)
return(f(x))
v<-paste("n",n,sep="")
if (exists(v,envir=memo))
return(get(v,envir=memo))
else{
rval<-f(Recall(n-1))
assign(v,rval,envir=memo)
}
}
}