将递归与地图相结合 - 是减少解决方案吗?

Combining recursion with map - is reduce the solution?

在此示例中,我试图不惜一切代价避免使用 for 循环。考虑这个简单的案例:

我有一个向量 z 和一个初始条件 b1:

z <- 1:5
b1 <- 0

还要考虑这个简单的函数,比如添加:

f <- function(y, b){
 return(y + b)
}

我想编写一个生成序列 S 的函数,如下所示:第一个元素,称之为 S[1]f 的输出 [=18] =]参数作为z[1]b参数作为初始条件b1。第二个元素 S[2]S[2] = f(y = z[2], b = S[1])。我怎么能?

请记住,我不想使用 cumsum 之类的东西,因为我的实际功能 f 更复杂 这种情况下所需的输出将是向量:

c(0 + 1,
1 + 2,
3 + 3,
6 + 4,
10 + 5)

c(1, 3, 6, 10, 15)

我考虑过使用 reduce,但我猜它只接受递归参数 b 而不是映射部分 y

的交易
Reduce(function(prev, this) prev + this,
       1:5, init=0, accumulate=TRUE)[-1]
# [1]  1  3  6 10 15

你可以很容易地使用你自己的函数来代替我的匿名函数,我这样定义它是为了演示哪个值是哪个:第一个参数是你的 S[n-1],第二个是你的 z[n].

[-1]是因为:without init=,函数的第一次调用实际上是f(prev=z[1], this=z[2]),这是正确的当您的 b1 为 0 时。如果 b1 是任何其他值,那么您必须使用 init=b1。但是,当使用 init= 时,它 有效地 将其添加到输入向量(您的 z)。这意味着第一次调用该函数是 f(prev=b1, this=z[1]) 这是正确的,但它也意味着 return 值 包括 b1 因此太长。幸运的是,我们可以很容易地删除第一个元素。

最后,Reduce 的正常操作是仅 return 上次调用函数的值(因此 reduction 的概念 Reduce);使用 accumulate= 实际上意味着 Reduce 是一个 cumulative-operation 函数。