【问题标题】:R - converting recursive code to functional programmingR - 将递归代码转换为函数式编程
【发布时间】:2013-03-02 22:00:40
【问题描述】:

我想做一个有条件的cumsum。我原本以为我可以使用 Reduce 功能,但我不能。解释清楚:

a <- rep(1,5)
b <- rnorm(n=5,mean=0.5)
c <- rep(2,5)
d <- rep(0.5,5)

Reduce( '+', a, init=200 , accumulate=TRUE)

结果

[1] 200 201 202 203 204 205

这就像一个简单的cumsum。但我真正想要的是一个有条件的 cumsum:

递归定义为:

 x0 = 200
 index = 0

 function (x) {
   index = index + 1
   if( x is between 200 and 202 ) return x + a[index]
   else if(x is between 202 and 204) return x + b[index]
   else if(x is between 204 and 206) return x + c[index]
   else return x + d[index]

 }

预期的结果可能是这样的(当然,由于随机性,它永远不会相同。

  [1] 200 201 202.3 203.8 204.1 205

有兴趣的可以在这里找到答案: Convert simple recursive relation to functional program

我似乎找不到将这个问题标记为已关闭的方法,因为版主一直在删除我添加的任何内容,而没有建议正确的关闭方法。

【问题讨论】:

  • 我不明白这个递归是怎么回事?你的例子也需要更清楚。也给出确切的期望结果作为示例。不要只是描述它。
  • 我已经通过将递归置于函数格式中来阐明它。当然,没有明确的“预期答案”,因为其中涉及随机性。如果您愿意,我可以通过使用一些固定值来使其更清楚,但我不希望读者使用固定的数学公式来回答,我想了解如何使用高阶函数来做到这一点。
  • @user1480926 我认为这不是 Reduce 的工作。首先你不能给Reduce一个矩阵。你可以只给出一个向量(也许你可以创建一个向量,在 a 和 b 之间交替)其次你的索引变量必须是一个全局变量,比如index &lt;&lt;- index +1...
  • 感谢@agstudy,那么在处理比 R 中的向量更复杂的数据时,有没有办法使用优雅的高阶函数?
  • @user1480926 我不能说没有。我是说这不是Reduce 的工作,至少在你介绍它时是这样。您是否有一个很大的工作流程,您尝试在 2 个列表之间交替,或者只是想学习Reduce

标签: r recursion functional-programming reduce higher-order-functions


【解决方案1】:

我认为您在这里不需要Reduce。这是一个解释Reduce用例的示例:

 Reduce(paste,list(1:3,letters[1:3],LETTERS[1:3]))
[1] "1 a A" "2 b B" "3 c C"

我认为您尝试使用ifelse 完成的操作是矢量化的。这里以一个从初始值开始的 a 和 b 的条件立方和为例。

a <- rep(1,5)
b <- rep(0.01,5)
init <- 200
x <- seq_along(a)
cumsum(c(init,ifelse( x %% 2 ,a[x],  b[x])))
[1] 200.00 201.00 201.01 202.01 202.02 203.02

当然,如果你有多个条件:

  • 使用多个条件:x %% 2 &amp; x^2 &lt; 5
  • 使用嵌套的ifelse : ifelse( x %% 2 ,ifelse(x^2 &lt;2, a[x], b[x]),1)

【讨论】:

  • 嗨 agstudy 什么是一个干净的方式来做更多的 ifs。例如: if{ a } elseif {b } elseif{c} else{d} ?以及 a[x] b[x] 以外的更多选项(例如,如果我有 c[x],d[x] 以及?
  • @user1480926 将伪代码中的条件添加到您的 OP 我将帮助编写它。
  • @user1480926 我注意到您更改了x 的条件,现在条件是x cumsum 的结果?注意 x 的索引 ....我认为你不能用 ifelse 来做到这一点,你需要一个 loop
  • 是的,这就是我首先尝试使用 Reduce 函数的原因,因为我认为它会跟踪迭代中的先前结果并且不需要数学类型的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2015-05-30
相关资源
最近更新 更多