将递归与地图相结合 - 是减少解决方案吗?
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 函数。
在此示例中,我试图不惜一切代价避免使用 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 函数。