如何在R中实现递归过程?

时间:2013-02-07 14:02:59

标签: r recursion

假设我有一个向量v = c(250,1200,700),一个起始值n和一个函数,例如。

f = function(v){

g = function(v){ 
    cases(
    v <= 20 -> 0.1,
    v > 20 & v <= 100 -> 0.075,
    v > 100 -> .05
    )  
  }
  suppressWarnings(g(v))
}

f是使用cases包中的memisc编写的 - 我还是R的新手,我很想知道f是否可以编码为'{1}}更好的方法。无论如何,我正在寻找将执行以下递归过程的代码(包括'大'长度的向量):

f(n), 
f(n)*v[1]+n, 
f(f(n)*v[1]+n)*v[2] + f(n)*v[1]+n, 
f(f(f(n)*v[1]+n)*v[2] + f(n)*v[1]+n)*v[3] + f(f(n)*v[1]+n)*v[2] + f(n)*v[1]+n 

最终我对最后一行的价值感兴趣。

为任何帮助干杯

2 个答案:

答案 0 :(得分:3)

如果我理解你,那就是你正在谈论的过程:

 X1 = f(n)
 X2 = X1*v[1] + n
 X3 = F(X2)*v[2] + X2
 X4 = F(X3)*v[3] + X3 
...

如果您需要所有中间步骤,则递归函数相当无用,因为您还需要存储在结果中的中间步骤。因此,您可以使用基本R:

轻松编写代码
Thefun <- function(v,n){
  l <- length(v)
  res <- numeric(l+1)

  res[1] <- g(n)
  res[2] <- res[1]*v[1] + n
  for(i in seq(2,l)){
    res[i+1] <- res[i] + g(res[i])*v[i]
  }
  return(res)
}

结果的最后一个值是您需要的结果。由于您只需要最后一步的结果,您可以使用Recall递归执行:

Recfunc <- function(v,n){
    l <- length(v)
    if(l > 0){
        res <- Recall(v[-l],n)
        return(g(res)*v[l] + res)
    } else {
      return(n)
    } 
}

旁注

你可以定义你的函数g,就像这样(我称之为fv):

fv <- function(v){
   0.1*(v <= 20) + 0.075*(v > 20 & v <=100) + 0.05*(v>100)
}

如果与您的功能相比,您的速度会提高6倍。

vec <- sample(1:150,1e5,TRUE)
benchmark(
   fv(vec),
   g(vec),
   columns=c("test","replications","elapsed","relative"),
   replications = 1000

)

     test replications elapsed relative
1 fv(vec)         1000    9.39    1.000
2  g(vec)         1000   56.30    5.996

答案 1 :(得分:1)

我在这里假设n是v的长度。 我像这样重写递归:

y1 <- n                  ## slight change here
y2 <- f(y1)*v[1] +y1, 
y3 <- f(y2)*v[2] +y2
y4 <- f(y3)*v[3] +y3
.... I can''t see the terms > length(v) so my first assumption

例如,您可以像下面这样实现:

filter.f <- function(func=f,coef=v){
  n <-  length(coef)
  y <- numeric(n)
  y[1] <- n
  for(i in 2:n)
    y[i] <- func(y[i-1])*coef[i-1]+y[i-1] ## here the recursion
  y[1] <- f(n)
  y
}

 filter.f()
[1]   0.1 124.0 159.0 191.5
 v=c(250, 1200, 700)
filter.f()
[1]   0.1  28.0 118.0