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

标签 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 是使用 memisc 包中的 cases 编写的 - 我对 R 还很陌生,很想知道 f 可以用“更好”的方式编码。无论如何,我正在寻找将执行以下递归过程的代码(包括“大”长度的向量):

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 

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

为任何帮助干杯

最佳答案

如果我没理解错的话,这就是你所说的过程:

 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

关于r - 如何在R中实现递归过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14752980/

相关文章:

php - mysql选择递归查询

python - 如何使用递归计算嵌套列表的最大长度?

r - 当长流程完成时设置 R 警报

r - 查找组内超出阈值的点数

r - 日期计算用天而不是秒

algorithm - 递归如何在排列中工作?

javascript - 我在用 JavaScript 编写递归函数时遇到问题 - 它似乎没有正确地将 "fall back"到更小的深度

c++ - 所有带有 "recursion"的 child 的静态变量

根据向量的第一个字符在 R 中重新编码变量

r - 如何在 R 中对包含逗号分隔数字的字符串进行排序