假设我有一个向量 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/